"), o.close(); var d = n.mapValues(u.SandboxedFunctions, (function(e) { return i[e] } )); c.dispatch(r.SANDBOXED_FUNCTIONS_ADDED, { sandboxedFunctions: d }), t.parentNode.removeChild(t) } catch (e) { l.warn("Unable to create a sandbox: ", e) } } } ), (function(e, t, i) { var n = i(2) , r = i(23) , a = i(94) , o = i(16) , s = o.get("stores/plugins") , u = i(7) , c = i(25) , l = i(9) , d = !1 , f = [i(107), i(108), i(128)] , g = ["clientMetadata", "cookieDomain", "disable", "load", "optOut", "rum"]; t.push = function(e, t) { var i, a, o, s; if (!n.isArray(e) && n.isObject(e)) s = n.isUndefined(e.version) ? 1 : e.version, i = e.type, o = [e]; else if (n.isArray(e)) s = 0, i = e[0], o = e.slice(1); else { if (!n.isString(e)) return r.warn("API / Ignoring non-array/object/string argument:", e), !1; s = 0, i = e, o = [] } if (f[s] && (a = f[s][i]), t && g.indexOf(i) === -1) return r.debug("API / Ignoring non high priority function:", i, o), !1; if (!a) return r.warn('API / No function found for "' + i + '" (v' + s + ") with arguments:", o), !1; r.log('API / Executing: "' + i, '" with arguments:', o); try { a.apply(null, o), l.dispatch(u.RECORD_API_USAGE, { methodName: s ? "v" + s + "." + i : i }) } catch (e) { r.error(e) } return !0 } , t.get = function(e) { if (d && "state" !== e) return void r.warn('Module "' + e + '" not found.'); r.log('API / Getting module: "' + e + '"'); var t = a[e]; return t ? n.isArray(t) && (t = o.evaluate(t)) : t = s.getPlugin(c.PluginTypes.apiModules, e), t ? (l.dispatch(u.RECORD_API_USAGE, { methodName: "get." + e }), t) : void r.warn('Module "' + e + '" not found.') } } ), (function(e, t, i) { function n(e, t, i, n) { var r = e.getLayerState(n) , a = t.get(n) , s = i.get(); if (!r || !a) return s ? { layer: { name: s.layerName, id: s.layerId, policy: s.layerPolicy, integrationStringVersion: s.integrationStringVersion }, experiment: { name: s.experimentName, id: s.experimentId }, variation: { name: s.variationName, id: s.variationId }, isLayerHoldback: !1 } : null; if (l.isSingleExperimentPolicy(a.policy) && r.decision.isLayerHoldback) return null; var u = r.decision.experimentId , c = r.decision.variationId; if (!u || !c) return null; var d, f; return (d = o.find(a.experiments, { id: u })) ? (f = o.find(d.variations, { id: c }), f ? { layer: { name: a.name, id: a.id, policy: a.policy, integrationStringVersion: a.integrationStringVersion }, experiment: { name: d.name, id: d.id }, variation: { name: f.name, id: f.id }, isLayerHoldback: r.decision.isLayerHoldback } : null) : null } function r(e, t, i, n, r, s) { var u = [] , c = e.getLayerStates(); s.onlySingleExperiments && (c = o.filter(c, (function(e) { var i = t.get(e.layerId); return i && l.isSingleExperimentPolicy(i.policy) } ))); var f = o.map(c, (function(e) { var t = !!e.decision.variationId , i = e.decisionActivationId && e.decisionActivationId === n.getActivationId() , r = d.getExperimentAndVariation() , a = r ? r.variationId : null , s = t && e.decision.variationId === a; return o.extend(e, { isActive: t && i || s, visitorRedirected: s }) } )) , g = r ? o.filter(f, r) : f; return o.each(g, (function(e) { var n = a(e, t, i, s.includeOfferConsistency); n && u.push(n) } )), u } function a(e, t, i, n) { var r, a, s = e.layerId, u = t.get(s) || {}, c = o.map(u.experiments, (function(e) { return o.pick(e, ["id", "name"]) } )); if (n || !u.decisionMetadata || !u.decisionMetadata.offerConsistency) { var l = { id: s, campaignName: u.name || null, experiment: null, allExperiments: c, variation: null, reason: e.decision.reason, isActive: !!e.isActive, visitorRedirected: e.visitorRedirected, isInCampaignHoldback: e.decision.isLayerHoldback }; e.decision && e.decision.experimentId && (r = o.find(u.experiments, { id: e.decision.experimentId })), r && (l.experiment = o.pick(r, ["id", "name", "campaignName"])), r && e.decision.variationId && (a = o.find(r.variations, { id: e.decision.variationId })), a && (l.variation = o.pick(a, ["id", "name"])); var d = o.map(e.decisionTicket.audienceIds, (function(e) { return o.pick(i.get(e), ["id", "name"]) } )); return l.audiences = d, u.decisionMetadata && u.decisionMetadata.offerConsistency && (l.pageId = e.pageId), l } } var o = i(2) , s = i(95) , u = i(96) , c = i(98) , l = i(44) , d = i(99); t.data = ["stores/audience_data", "stores/client_metadata", "stores/event_data", "stores/layer_data", "stores/view_data", "stores/group_data", "stores/interest_group", "stores/tag_group", "stores/global", function(e, t, i, n, r, a, s, l, d) { var f = {} , g = {} , p = {} , h = { audiences: e.getAudiencesMap(), events: i.getEventsMap(), campaigns: f, pages: r.getPagesMap(), experiments: g, variations: p, projectId: d.getProjectId(), snippetId: d.getSnippetId(), accountId: d.getAccountId(), dcpServiceId: d.getDCPServiceId(), revision: d.getRevision(), clientName: t.getClientName(), clientVersion: t.getClientVersion() } , _ = c.dereferenceChangeId; return o.each(n.getAll(), (function(e) { u.defineProperty(f, e.id, (function() { var t = o.extend({}, e); return u.defineProperty(t, "changes", (function() { return o.map(e.changes, _) } ), "campaign"), u.defineProperty(t, "experiments", (function() { return o.map(e.experiments, (function(e) { return g[e.id] } )) } ), "campaign"), t } ), "campaignMap", "byId"), o.each(e.experiments, (function(e) { u.defineProperty(g, e.id, (function() { var t = o.extend({}, e); return u.defineProperty(t, "changes", (function() { return o.map(e.changes, _) } ), "experiment"), u.defineProperty(t, "variations", (function() { return o.map(e.variations, (function(e) { return p[e.id] } )) } ), "experiment"), t } ), "experimentMap", "byId"), o.each(e.variations, (function(e) { u.defineProperty(p, e.id, (function() { var t = o.extend({}, e); return u.defineProperty(t, "actions", (function() { return o.map(e.actions, (function(e) { return o.extend({}, e, { changes: o.map(e.changes, _) }) } )) } ), "variation"), t } ), "variationMap", "byId") } )) } )) } )), h.groups = a.getGroupsMap(), h } ], t.visitor = ["stores/visitor", function(e) { return o.cloneDeep(e.getVisitorProfile()) } ], t.visitor_id = ["stores/visitor_id", function(e) { return { randomId: e.getRandomId() } } ], t.state = ["stores/audience_data", "stores/layer_data", "stores/layer", "stores/view_data", "stores/view", "stores/global", "stores/observed_redirect", function(e, t, i, a, u, c, f) { return { getCampaignStates: function(n) { var a = {} , s = r(i, t, e, c, n, { includeOfferConsistency: !1 }); return o.each(s, (function(e) { a[e.id] = e } )), a }, getExperimentStates: function(n) { var a = r(i, t, e, c, n, { includeOfferConsistency: !1, onlySingleExperiments: !0 }) , s = ["audiences", "variation", "reason", "visitorRedirected", "isActive"] , u = o.reduce(a, (function(e, t) { var i = t.allExperiments[0]; return e[i.id] = o.extend({}, o.pick(t, s), { id: i.id, experimentName: i.name, isInExperimentHoldback: t.isInCampaignHoldback }), e } ), {}); return u }, getCampaignStateLists: function(n) { var a = {} , s = r(i, t, e, c, n, { includeOfferConsistency: !0 }); return o.each(s, (function(e) { var t = e.id; a[t] || (a[t] = []), a[t].push(e) } )), a }, getPageStates: function(e) { var t = u.getAll() , i = o.reduce(t, (function(e, t) { var i = a.get(t.id); return e[t.id] = o.extend({}, o.pick(i, ["id", "name", "apiName", "category", "staticConditions", "tags"]), o.pick(t, ["isActive", "metadata"])), e[t.id].isActive = !!e[t.id].isActive, e } ), {}); return e ? o.pickBy(i, e) : i }, isGlobalHoldback: function() { return c.isGlobalHoldback() }, getActivationId: function() { return c.getActivationId() }, getVariationMap: function() { var e = i.getLayerStates() , n = {}; return o.each(e, (function(e) { var i = t.get(e.layerId); if (e.decision && e.decision.experimentId && (n[e.decision.experimentId] = { id: e.decision.variationId, name: null, index: null }, i)) { var r = o.find(i.experiments, { id: e.decision.experimentId }); if (r && e.decision.variationId) var a = o.find(r.variations, { id: e.decision.variationId }) , s = o.findIndex(r.variations, { id: e.decision.variationId }); a && (n[e.decision.experimentId] = { id: e.decision.variationId, name: a.name, index: s }) } } )), n }, getActiveExperimentIds: function() { var e = {}; return o.each(this.getCampaignStateLists({ isActive: !0 }), (function(t) { o.each(t, (function(t) { e[t.experiment.id] = !0 } )) } )), o.keys(e) }, getRedirectInfo: function() { var e = d.getExperimentAndVariation(); return e && (e.referrer = d.getReferrer()), e }, getDecisionString: function(e) { if (!e) throw new Error("Must pass a config to getDecisionString"); e = o.extend({ maxLength: 255, shouldCleanString: !1 }, e); var r = n(i, t, f, e.campaignId); return r ? s.generateAnalyticsString(r.layer, r.experiment, r.variation, r.isLayerHoldback, e.maxLength, e.shouldCleanString) : null }, getDecisionObject: function(e) { if (!e) throw new Error("Must pass a config to getDecisionObject"); e = o.extend({ maxLength: 255, shouldCleanString: !1 }, e); var r = n(i, t, f, e.campaignId); if (!r) return null; var a = s.formatNamesAndIdsForAnalytics(r.layer, r.experiment, r.variation, e.shouldCleanString) , u = o.mapValues(a.names, (function(t, i) { return s.combineAndTruncateIdAndName(t, a.idStrings[i], e.maxLength) } )) , c = { experiment: u.experiment, variation: u.variation }; return l.isSingleExperimentPolicy(r.layer.policy) || o.extend(c, { campaign: u.layer, holdback: r.isLayerHoldback }), c } } } ], t.utils = i(100).create(), t.jquery = ["env/jquery", function(e) { return e } ], t.event_emitter = i(106) } ), (function(e, t, i) { function n(e) { return e.replace(/[^a-zA-Z0-9\.\~\!\*\(\)\']+/g, "_") } function r(e) { return !u.isEmpty(e) && u.includes(["and", "or", "not"], e[0]) } function a(e, t) { var i = ""; return u.isEmpty(t) ? i = d : (i = u.reduce(t, (function(t, i) { var r = e.get(i); return r ? t + n(r.name ? r.name : r.id) + "," : t } ), ""), i = i.slice(0, -1)), i } function o(e, i, n, r, a, o) { if (!_.isSingleExperimentPolicy(e.policy) || !r) { var s = !_.isSingleExperimentPolicy(e.policy) && r , c = t.formatNamesAndIdsForAnalytics(e, i, n, o) , d = [c.names.experiment, c.names.variation] , g = [c.idStrings.experiment, c.idStrings.variation]; _.isSingleExperimentPolicy(e.policy) || (d.unshift(c.names.layer), g.unshift(c.idStrings.layer)); var p = u.reduce(g, (function(e, t) { return e + t.length } ), 0) , h = d.length - 1 + (s ? 1 : 0) , v = h * l.length , m = p + v; if (s && (m += f.length), m > a) throw new Error("The analytics string size is too low to send the entity IDs."); for (var E = a - m, I = d.length, y = [], S = d.length - 1; S >= 0; S--) { var A = d[S] , T = Math.min(A.length, Math.floor(E / I)); E -= T, I--, y.unshift(A.substring(0, T)) } var R = u.map(y, (function(e, t) { return e + g[t] } )); return s && R.push(f), R.join(l) } } function s(e, i, n, r, a, o) { var s = r ? f : g , c = 3 * l.length , d = t.formatNamesAndIdsForAnalytics(e, i, n, o) , p = d.names , h = d.idStrings , v = u.reduce(h, (function(e, t) { return e + t.length } ), 0); if (v + c + s.length > a) throw new Error("The analytics string size is too low to send the campaign, experiment, and variation IDs."); var m = a - v - c - s.length , E = {}; E.variation = Math.min(p.variation.length, Math.floor(m / 3)), m -= E.variation, E.experiment = Math.min(p.experiment.length, Math.floor(m / 2)), m -= E.experiment, E.layer = m; var I = {}; u.each(p, (function(e, t) { I[t] = e.substring(0, E[t]) } )); var y = []; return _.isSingleExperimentPolicy(e.policy) || y.push(I.layer + h.layer), y = y.concat([I.experiment + h.experiment, I.variation + h.variation, s]), y.join(l) } var u = i(2) , c = i(16) , l = ":" , d = "everyone_else" , f = "holdback" , g = "treatment" , p = "" , h = i(23) , _ = i(44); t.formatNamesAndIdsForAnalytics = function(e, t, i, o) { var s = { layer: e.name || p, experiment: t.name || p, variation: i.name || p }; if (o && (s = u.mapValues(s, n)), s.experiment === p && (!e.integrationStringVersion || 1 === e.integrationStringVersion)) if (r(t.audienceIds)) s.experiment = "Exp"; else { var l = c.get("stores/audience_data"); s.experiment = a(l, t.audienceIds) } var d = { layer: "(" + n(e.id) + ")", experiment: "(" + n(t.id) + ")", variation: "(" + n(i.id) + ")" }; return { names: s, idStrings: d } } , t.combineAndTruncateIdAndName = function(e, t, i) { var n = i - t.length; if (n < 0 && (h.warn("maxLength must be at least long enough to fit the entity ID, which is length" + t.length + ". Defaulting to only use entity ID as name."), e = p), e === p) return t; if (e.length > n) { var r = Math.min(e.length, n); return e = e.substring(0, r), e + t } return e + " " + t } , t.generateAnalyticsString = function(e, t, i, n, r, a) { return e.integrationStringVersion && 2 === e.integrationStringVersion ? o(e, t, i, n, r, a) : s(e, t, i, n, r, a) } } ), (function(e, t, i) { var n = i(97) , r = i(7) , a = i(9) , o = i(23); t.defineProperty = function(e, t, i, s, u) { n(e, t, (function() { var e = ["prop", s, u || t].join("."); return o.debug('Evaluating getter: "' + e + '"'), a.dispatch(r.RECORD_API_USAGE, { methodName: e }), i() } ), !0) } } ), (function(e, t) { "use strict"; function i(e, t, i, n) { Object.defineProperty(e, t, { get: function() { var e = i.call(this); return Object.defineProperty(this, t, { value: e, enumerable: !!n, writable: !0 }), e }, set: function(e) { return Object.defineProperty(this, t, { value: e, enumerable: !!n, writable: !0 }), e }, enumerable: !!n, configurable: !0 }) } e.exports = i } ), (function(e, t, i) { function n(e) { var i = r.cloneDeep(e); return i.changes && (i.changes = r.map(i.changes, t.dereferenceChangeId)), i.experiments && r.each(i.experiments, (function(e) { e.changes && (e.changes = r.map(e.changes, t.dereferenceChangeId)), e.variations && r.each(e.variations, (function(e) { e.actions && r.each(e.actions, (function(e) { e.changes && (e.changes = r.map(e.changes, t.dereferenceChangeId)) } )) } )) } )), i } var r = i(2) , a = i(16) , o = i(22) , s = i(96) , u = a.get("stores/change_data"); t.translateDecisionToCampaignDecision = function(e) { return c(r.cloneDeep(e), { layerId: "campaignId", isLayerHoldback: "isCampaignHoldback" }) } , t.translateLayerEventToCampaignEvent = function(e) { var t = {}; return s.defineProperty(t, "campaign", (function() { var t = n(e.data.layer); return t } ), "campaignEvent"), t.decisionTicket = e.data.decisionTicket, t.decision = this.translateDecisionToCampaignDecision(e.data.decision), t.audiences = e.data.audiences, { type: "lifecycle", name: "campaignDecided", data: t } } , t.translateViewActivatedToPageActivated = function(e) { return { type: "lifecycle", name: "pageActivated", data: { page: e.data.view } } } , t.dereferenceChangeId = function(e) { var t = u.getChange(e); return t ? o.safeReference(t) : e } ; var c = function(e, t) { var i = r.omit(e, r.keys(t)); return r.each(t, (function(t, n) { i[t] = e[n] } )), i } } ), (function(e, t, i) { var n = i(2) , r = i(16) , a = r.get("stores/observed_redirect"); t.getReferrer = function() { var e = a.get(); return e ? e.referrer : null } , t.getExperimentAndVariation = function() { var e = a.get(); return e && n.isString(e.variationId) ? n.pick(e, ["experimentId", "variationId"]) : null } } ), (function(e, t, i) { var n = i(12).Promise , r = i(101).observeSelector , a = i(102).poll , o = i(104).waitForElement , s = i(105).waitUntil; t.create = function() { return { observeSelector: r, poll: a, Promise: n, waitForElement: o, waitUntil: s } } } ), (function(e, t, i) { function n() { if (f.shouldObserveChangesIndefinitely()) { var e = { attributes: !0, childList: !0, subtree: !0, characterData: !0 } , t = g.getDocumentElement() , i = new MutationObserver(function() { this.disconnect(), l.each(l.keys(m), a), this.observe(t, e) } ); return function(n) { var r = m[n]; i.observe(t, e), r.cancelObservation = function() { delete m[n], l.isEmpty(m) && i.disconnect() } } } return function(e) { var t = h.poll(l.partial(a, e)); m[e].cancelObservation = function() { t(), delete m[e] } } } function r(e) { var t = m[e]; t && t.cancelObservation && t.cancelObservation() } function a(e) { if (m[e]) { if (o(m[e])) return 0 === m[e].matchedCount && l.isFunction(m[e].options.onTimeout) && m[e].options.onTimeout(), void r(e); var t = document.querySelectorAll(m[e].selector); t.length && (l.each(t, (function(t) { t.ni && t.ni[e] || m[e].callbackQueue.push(t) } )), s(e)) } } function o(e) { var t = e.options.timeout; if (null !== t) if ("function" == typeof t) try { return t() } catch (e) {} else if (Date.now() - e.startTime > t) return !0; return !1 } function s(e) { for (; m[e] && m[e].callbackQueue.length; ) { var t = m[e].callbackQueue.shift(); if (u(t, e), m[e].matchedCount = m[e].matchedCount + 1, m[e].callback(t), m[e] && m[e].options.once) return void r(e) } } function u(e, t) { e.ni || (e.ni = {}), e.ni[t] = !0 } function c(e) { try { document.querySelector(e) } catch (e) { return !1 } return !0 } var l = i(2) , d = (i(7), i(16)) , f = d.get("stores/directive") , g = i(80) , p = (i(25), i(9), i(5).generate) , h = i(102) , _ = i(40) , v = (d.get("stores/rum"), { once: !1, onTimeout: null, timeout: null }) , m = {} , E = function(e) { (E = n())(e) }; t.observeSelector = function(e, t, i) { if (!c(e)) throw new Error("observeSelector expects a valid css selector as its first argument"); if (!l.isFunction(t)) throw new Error("observeSelector expects a function as its second argument"); if (i && (!l.isObject(i) || l.isFunction(i))) throw new Error("observeSelector expects an object as its third argument"); var n = p(); return i = l.assign({}, v, i || {}), m[n] = { callback: t, callbackQueue: [], matchedCount: 0, options: i, selector: e, startTime: Date.now() }, E(n), _.setTimeout(l.bind(a, null, n), 0), l.partial(r, n) } } ), (function(e, t, i) { function n(e) { l[e] && a.each(l[e].callbacks, (function(e) { e.call(null) } )) } function r(e, t) { l[t] && l[t].callbacks[e] && (delete l[t].callbacks[e], a.some(l[t].callbacks) || (clearInterval(l[t].id), delete l[t])) } var a = i(2) , o = (i(7), i(16)) , s = (i(25), i(9), i(5).generate) , u = i(40) , c = i(103).DEFAULT_INTERVAL , l = (o.get("stores/rum"), {}); t.poll = function(e, t) { a.isNumber(t) || (t = c), l[t] || (l[t] = { callbacks: {}, id: u.setInterval(a.partial(n, t), t) }); var i = s(); return l[t].callbacks[i] = e, a.partial(r, i, t) } , t.cancelAll = function() { a.each(l, (function(e, t) { clearInterval(e.id), delete l[t] } )) } } ), (function(e, t) { e.exports = { DEFAULT_INTERVAL: 20 } } ), (function(e, t, i) { var n = i(12).Promise , r = i(101).observeSelector; t.waitForElement = function(e) { return new n(function(t, i) { r(e, t, { once: !0 }) } ) } } ), (function(e, t, i) { var n = i(12).Promise , r = i(102).poll; t.waitUntil = function(e) { return new n(function(t, i) { if (e()) return void t(); var n = r((function() { e() && (n(), t()) } )) } ) } } ), (function(e, t, i) { var n = i(87); t.on = function(e) { return e.publicOnly = !0, n.on(e) } , t.off = n.off, t.emit = function(e) { n.emit(e) } } ), (function(e, t, i) { function n(e) { var t, i = {}; if (e) if (r(e)) t = Number(e); else { if ("object" != typeof e) throw new Error("tracker","Revenue argument",e,"not a number."); if (i = a.extend({}, e), "revenue"in i) { if (!r(i["revenue"])) throw new Error("tracker","Revenue value",i["revenue"],"not a number."); t = Number(i["revenue"]), delete i["revenue"] } } return a.isUndefined(t) || (i.revenue = t), i } function r(e) { return a.isNumber(e) || a.isString(e) && Number(e) == e } var a = i(2) , o = i(108); t.activateGeoDelayedExperiments = function(e, t) { t || (t = e.lists ? "odds" : "cdn3"), o.dataFromSource({ data: e, source: t }) } , t.activateSiteCatalyst = function(e) { e && e.sVariable && o.integrationSettings({ id: "adobe_analytics", settings: { sVariableReference: e.sVariable } }) } , t.bucketUser = t.bucketVisitor = function(e, t) { if (e && t) { var i = { experimentId: String(e) }; t > 256 ? i.variationId = String(t) : i.variationIndex = String(t), o.bucketVisitor(i) } } , t.disable = function(e) { o.disable({ scope: e }) } , t.log = function(e) { a.isUndefined(e) && (e = !0), o.log({ level: e ? "INFO" : "OFF" }) } , t.optOut = function(e) { a.isUndefined(e) && (e = !0), o.optOut({ isOptOut: e }) } , t.setCookieDomain = function(e) { o.cookieDomain({ cookieDomain: e }) } , t.setCookieExpiration = function(e) { o.cookieExpiration({ cookieExpirationDays: e }) } , t.setDimensionValue = function(e, t) { var i = {}; i[e] = t, o.user({ attributes: i }) } , t.setUserId = function(e) { o.user({ userId: e }) } , t.storeThirdPartyData = function(e, t) { o.dataFromSource({ source: e, data: t }) } , t.trackEvent = function(e, t) { o.event({ eventName: e, tags: n(t) }) } } ), (function(e, t, i) { function n(e) { var t; return e.eventId && (t = I.create(e.eventId, e.eventName, "custom")), b.updateAllViewTags(), function() { var i = g.trackCustomEvent(e.eventName, e.tags, t); i ? R.log("API / Tracking custom event:", e.eventName, e.tags) : R.log("API / Not tracking custom event:", e.eventName) } } function r(e) { var t; return e.eventData && (t = I.create(e.eventData.id, e.eventData.apiName, "click", e.eventData)), function() { var e = g.trackClickEvent(t); e ? R.log("API / Tracking click event:", e) : R.log("API / Not tracking click event:", e) } } function a(e) { var t = e.eventData , i = T.createLayerState(t.layerId, t.experimentId, t.variationId, t.isLayerHoldback) , n = T.createSingle(t.layerId, t.experimentId, t.variationId); return function() { T.recordLayerDecision(i.layerId, i.decisionTicket, i.decision), R.log("API / Tracking decision event:", i), g.trackDecisionEvent(i.decision, i.decisionTicket, n) } } function o(e) { var t = b.create(e.eventData.id, e.eventData.apiName) , i = b.createState(t.id); return function() { var e = g.trackViewActivation(t, i); e ? R.log("API / Tracking pageview event:", e) : R.log("API / Not tracking pageview event:", e) } } var s = i(2) , u = i(7) , c = i(93) , l = i(94) , d = i(109) , f = i(25) , g = i(110) , p = i(117) , h = i(6) , _ = i(76).create , v = i(24) , m = i(118) , E = i(120) , I = i(121) , y = i(87) , S = i(9) , A = i(26) , T = i(113) , R = i(23) , w = i(122) , D = i(114) , b = i(123) , O = i(74) , N = i(16) , C = N.get("stores/dimension_data") , L = N.get("stores/view") , P = N.get("stores/view_data") , V = N.get("stores/visitor_id") , k = N.get("stores/layer_data") , F = N.get("stores/directive") , x = !1 , M = !1 , U = x || M , G = 86400 , B = 90 , z = t.ApiListenerError = _("ApiListenerError"); t.event = function(e) { var t; switch (e.eventType) { case "click": t = r(e); break; case "decision": t = a(e); break; case "pageview": t = o(e); break; case "custom": default: t = n(e) } V.getBucketingId() ? t() : S.dispatch(u.ADD_CLEANUP_FN, { lifecycle: f.Lifecycle.postActivate, cleanupFn: t }) } , t.clientMetadata = function(e) { U && (S.dispatch(u.SET_CLIENT_NAME, e.clientName), S.dispatch(u.SET_CLIENT_VERSION, e.clientVersion)), x && e.forceVariationIds && S.dispatch(u.LOAD_DIRECTIVE, { forceVariationIds: e.forceVariationIds }) } , t.priorRedirectString = function(e) { U && D.load(e.value) } , t.microsnippetError = function(e) { if (U) { var t = e.errorData.metadata && e.errorData.metadata.err || {}; t.name = e.errorData.code; var i = { engine: e.engine, msVersion: e.errorData.msVersion, requestId: e.errorData.requestId, projectId: e.errorData.projectId, snippetKey: e.errorData.snippetKey, args: e.errorData.args }; E.handleError(t, i) } } , t.rum = function(e) { S.dispatch(u.SET_RUM_DATA, e.eventData) } , t.initialViewStates = function(e) { var t = s.map(e.states, (function(e, t) { return { id: t, isActive: e } } )); b.registerViews(t) } , t.page = function(e) { var t = P.getByApiName(e.pageName); if (!t) throw new Error('Unknown page "' + e.pageName + '"'); var i = !e.hasOwnProperty("isActive") || e.isActive , n = function() { i ? b.activateViaAPI(t, e.tags) : (b.deactivate(t), R.log("API / Deactivated Page", b.description(t))) }; V.getBucketingId() ? n() : S.dispatch(u.ADD_CLEANUP_FN, { lifecycle: f.Lifecycle.postViewsActivated, cleanupFn: n }) } , t.tags = function(e) { b.setGlobalTags(e.tags) } , t.user = function(e) { U && e.visitorId && (V.getBucketingId() ? (R.log("API / Setting visitor Id:", e.visitorId), O.setId({ randomId: e.visitorId })) : (R.log("API / Setting visitor Id for activation:", e.visitorId), S.dispatch(u.SET_VISITOR_ID_VIA_API, e.visitorId))), x && s.each(["IP", "location", "queryParams", "url"], (function(t) { e[t] && (R.log("API / Setting", t, ":", e[t]), j(t, e[t], !1)) } )), R.log("API / Setting visitor custom attributes:", e.attributes), s.each(e.attributes, (function(e, t) { var i, n, r = t, a = C.getById(t) || C.getByApiName(t); a && (r = a.id, i = a.apiName, n = a.segmentId || a.id); var o = { id: n, value: e }; i && (o.name = i), j(r, o, !0) } )) } ; var j = function(e, t, i) { var n = [{ key: i ? ["custom", e] : [e], value: t, metadata: { lastModified: v.now() } }] , r = function() { S.dispatch(u.SET_VISITOR_ATTRIBUTES, { attributes: n }) }; V.getBucketingId() ? r() : S.dispatch(u.ADD_CLEANUP_FN, { lifecycle: f.Lifecycle.postVisitorProfileLoad, cleanupFn: r }) }; t.optOut = function(e) { var t = !e.hasOwnProperty("isOptOut") || e.isOptOut; m.setOptOut(t) } , t.cookieExpiration = function(e) { var t = e.cookieExpirationDays; t < B && (R.error('Argument "cookieExpirationDays"=', t, "less than minimum days:", B, ", setting to minimum."), t = B), R.log("API / Setting cookie age to", t, "days."), S.dispatch(u.SET_COOKIE_AGE, t * G) } , t.extendCookieLifetime = function(e) { e = s.extend({ isEnabled: !0 }, e), R.log("API / Setting cookie automatic lifetime extension to", e.isEnabled), S.dispatch(u.SET_COOKIE_AUTO_REFRESH, e.isEnabled) } , t.cookieDomain = function(e) { R.log("API / Setting cookie domain to", e.cookieDomain), S.dispatch(u.SET_COOKIE_DOMAIN, e.cookieDomain) } , t.disable = function(e) { if (e.scope) { if ("tracking" !== e.scope) throw new Error('Unknown "scope" for disable: ' + e.scope); R.log("API / Disabling tracking"), S.dispatch(u.LOAD_DIRECTIVE, { trackingDisabled: !0 }) } else R.log("API / Disabling everything"), S.dispatch(u.LOAD_DIRECTIVE, { disabled: !0 }) } , t.log = function(e) { var t = e.level , i = e.match; s.isUndefined(t) && (t = "INFO"), s.isUndefined(i) && (i = ""), R.setLogMatcher(i), R.setLogLevel(t) } , t.registerModule = function(e) { var t = "custom/" + e.moduleName; if (l[t] || c.get(t)) throw new Error('Module name "' + t + '" is reserved. Will not be registered as plugin.'); w.registerApiModule(t, e.module) } , t.dataFromSource = function(e) { var t = e.source; h.makeAsyncRequest(t), h.resolveRequest(t, e.data) } , t.addListener = function(e) { if (!s.isFunction(e.handler)) throw new Error("A handler function must be supplied"); e = s.omit(e, "type"), e.publicOnly = !0, e.emitErrors = !0; var t = e.handler; e.handler = function(e) { try { return t(e) } catch (e) { throw new z(e) } } , y.on(e) } , t.removeListener = function(e) { if (!e.token) throw new Error("Must supply a token to removeListener"); y.off(e.token) } , t.load = function(e) { e.data = s.extend({}, e.data), d.normalizeClientData(e.data), S.dispatch(u.DATA_LOADED, { data: e.data }) } , t.integrationSettings = function(e) { if (!e.id) throw new Error("id is required"); if (!e.settings) throw new Error("settings is required"); S.dispatch(u.SET_INTEGRATION_SETTINGS, s.extend({}, e.settings, { id: e.id })) } , t.bucketVisitor = function(e) { if (!e.variationId && s.isUndefined(e.variationIndex) || e.variationId && e.variationIndex) throw new Error("One of a variationId or a variationIndex is required."); if (!e.experimentId) throw new Error("An experimentId is required."); var t, i, n = e.campaignId; if (n) { if (t = k.get(n), !t) throw new Error("Could not find layer " + n) } else if (t = k.getLayerByExperimentId(e.experimentId), n = t.id, !n) throw new Error("Could not find layer for experiment " + e.experimentId); if (i = s.find(t.experiments, { id: e.experimentId }), !i) throw new Error("Could not find experiment " + e.experimentId + " in layer " + n); var r = e.variationId; if (s.isUndefined(e.variationIndex)) { if (!s.find(i.variations, { id: r })) throw new Error("Cound not find variation " + r + " in experiment " + e.experimentId) } else if (r = i.variations[e.variationIndex].id, !r) throw new Error("Could not find variation at index " + e.variationIndex + " in experiment " + e.experimentId); O.updateVariationIdMap(n, e.experimentId, r), V.getBucketingId() && O.persistVariationIdMap() } , t.waitForOriginSync = function(e) { if (!s.isArray(e.canonicalOrigins)) throw new Error("canonicalOrigins must be an array. Got: " + A.stringify(e.canonicalOrigins)); s.each(e.canonicalOrigins, (function(e) { if (!s.isString(e)) throw new Error("Each item in canonicalOrigins must be a string. Found type " + typeof e) } )), S.dispatch(u.XDOMAIN_SET_CANONICAL_ORIGINS, { canonicalOrigins: e.canonicalOrigins }) } , t.disableCrossOrigin = function() { R.log("API / cross origin tracking is DISABLED"), S.dispatch(u.XDOMAIN_SET_DISABLED, { disabled: !0 }) } , t.activate = function() { F.shouldActivate() && !x ? (s.forEach(L.getActiveViewStates(), (function(e) { b.deactivate(P.get(e.id)) } )), S.dispatch(u.RESET_VIEW_STATES), p.emitActivateEvent()) : R.debug("Not activating.") } , t.sendEvents = function() { p.emitSendEvents() } , t.holdEvents = function() { p.emitHoldEvents() } } ), (function(e, t, i) { var n = i(2) , r = i(25); t.normalizeClientData = function(e) { !e.listTargetingKeys && e.listTargetingCookies && (e.listTargetingKeys = n.map(e.listTargetingCookies, (function(e) { return { type: r.ListTargetingKeyTypes.COOKIE, key: e } } )), delete e.listTargetingCookies) } } ), (function(e, t, i) { function n(e, t, i) { var n = c({ activeViewStates: z.getActiveViewStates(), visitorProfile: W.getVisitorProfile(), layerStates: H.getLayerStatesForAnalytics() }) , r = i && i.pageId ? d(i) : z.getActiveViewTags() , a = v.extend({}, r, t) , o = i && i.category ? i.category : w.OTHER; return v.extend(n, { eventEntityId: i && i.id, eventApiName: e, eventCategory: o, eventTags: a }) } function r(e, t) { var i = c({ activeViewStates: z.getActiveViewStates(), visitorProfile: W.getVisitorProfile(), layerStates: H.getLayerStatesForAnalytics() }); return v.extend(i, { pageId: e.id, pageApiName: e.apiName, viewCategory: e.category, eventTags: t.metadata }) } function a(e) { var t = c({ activeViewStates: z.getActiveViewStates(), visitorProfile: W.getVisitorProfile(), layerStates: H.getLayerStatesForAnalytics() }) , i = e.config && e.config.selector ? e.config.selector : e.eventFilter.selector , n = e.apiName , r = e.category || w.OTHER , a = e.id , o = d(e); return v.extend(t, { eventApiName: n, eventCategory: r, eventEntityId: a, eventTags: o, pageId: e.pageId, selector: i }) } function o() { var e = c({ activeViewStates: [], visitorProfile: W.getVisitorProfile(), layerStates: H.getLayerStatesForAnalytics() }); return v.extend(e, { eventTags: {} }) } function s(e, t, i, n) { var r = null , a = null , o = null; if (t.experimentId) { var s = v.find(n.experiments, { id: t.experimentId }); if (s && (r = s.name || null, o = s.integrationSettings, t.variationId)) { var u = v.find(s.variations, { id: t.variationId }); u && (a = u.name || null) } } var c = V.getReferrer() || T.getReferrer() , l = { sessionId: B.getSessionId(), decisionTicketAudienceIds: i.audienceIds, visitorId: $.getRandomId(), decisionId: e, activationId: G.getActivationId(), namespace: G.getNamespace(), timestamp: y.now(), pageId: i.pageId || null, variationId: t.variationId, variationName: a, experimentId: t.experimentId, experimentName: r, layerId: t.layerId, layerName: n.name, layerPolicy: n.policy, accountId: G.getAccountId(), projectId: G.getProjectId(), revision: String(G.getRevision()), clientName: U.getClientName(), clientVersion: U.getClientVersion(), referrer: c, integrationStringVersion: n.integrationStringVersion || 1, integrationSettings: v.extend({}, n.integrationSettings, o) }; return l } function u(e, t) { var i = v.extend({}, e, { isLayerHoldback: t, isGlobalHoldback: !1, clientName: v.isNull(e.clientName) ? S.NAME : e.clientName, integrationStringVersion: v.isNull(e.integrationStringVersion) ? 1 : e.integrationStringVersion, anonymizeIP: v.isNull(G.getAnonymizeIP()) ? void 0 : G.getAnonymizeIP(), activationId: G.getActivationId(), decisionTicketAudienceIds: [], sessionId: B.getSessionId(), activeViewStates: [], userFeatures: f(W.getVisitorProfile()), layerStates: H.getLayerStatesForAnalytics() }); return i } function c(e) { var t = V.getReferrer() || T.getReferrer() , i = { eventId: M.generate(), timestamp: y.now(), revision: G.getRevision(), clientName: U.getClientName(), clientVersion: U.getClientVersion(), projectId: G.getProjectId(), accountId: G.getAccountId(), activationId: G.getActivationId(), sessionId: B.getSessionId(), isGlobalHoldback: G.isGlobalHoldback(), namespace: G.getNamespace(), referrer: t, visitorId: $.getRandomId(), activeViewStates: e.activeViewStates, layerStates: e.layerStates, userFeatures: f(e.visitorProfile) }; return i } function l(e) { var t = z.getViewState(e) , i = t && t.isActive ? t.metadata : {}; return i } function d(e) { var t = {}; return e.pageId ? l(e.pageId) : t } function f(e) { var t = j.getAllPlugins(R.PluginTypes.visitorProfileProviders) , i = v.filter(t, { shouldTrack: !0 }) , n = { id: null, type: null, name: "", value: null, shouldIndex: !0 }; return v.reduce(i, (function(t, i) { try { var r = i.provides , a = e[r] , o = []; if (!v.isUndefined(a)) { v.isObject(a) ? o = v.map(a, (function(e, t) { var i = v.isObject(e) ? e : { value: e }; return v.extend({}, { type: r, name: t }, i) } )) : o.push({ type: r, value: a }); var s = v(o).map((function(e) { return v.pick(v.extend({}, n, e), v.keys(n)) } )).filter((function(e) { return !!e.value } )).value(); t = t.concat(s) } } catch (e) { L.warn("Error evaluating userFeature against visitorProfile:", e) } return t } ), []) } function g(e, t, i) { var n = p(e, i); L.debug("Found " + n.length + " analytics integrations defining a " + e + " hook"), L.debug("Calling each with data: ", t), v.each(n, (function(e) { try { L.debug("Calling plugin: " + e.name), e.hookFn(t), L.debug("Called plugin: " + e.name) } catch (e) { L.error(e) } } )) } function p(e, t) { var i = []; return v.each(j.getAllPlugins(R.PluginTypes.analyticsTrackers), (function(n, r) { if (n[e] && (!t || !n[t])) try { i.push({ name: r, hookFn: A.evaluate(n[e]) }) } catch (e) { L.error(e) } } )), i } function h(e, t, i) { var n = _(e, t); L.debug("Found " + n.length + " analytics integrations defining a trackLayerDecision " + e + " timing of " + t.join("|")), L.debug("Calling each with data: ", i), v.each(n, (function(e) { try { L.debug("Calling plugin: " + e.name), e.hookFn(i), L.debug("Called plugin: " + e.name) } catch (e) { L.error(e) } } )) } function _(e, t) { var i = []; return v.each(j.getAllPlugins(R.PluginTypes.analyticsTrackers), (function(n, r) { v.includes(t, n[e]) && i.push({ name: r, hookFn: n.trackLayerDecision }) } )), i } var v = i(2) , m = i(7) , E = i(86) , I = i(71) , y = i(24) , S = i(32) , A = i(16) , T = i(80) , R = i(25) , w = i(73) , D = i(87) , b = i(111) , O = i(112) , N = i(9) , C = i(113) , L = i(23) , P = (i(83), i(12).Promise) , V = i(99) , k = i(114) , F = i(116) , x = i(115) , M = i(5) , U = A.get("stores/client_metadata") , G = A.get("stores/global") , B = A.get("stores/session") , z = A.get("stores/view") , j = A.get("stores/plugins") , H = A.get("stores/layer") , K = A.get("stores/layer_data") , Y = A.get("stores/observed_redirect") , q = A.get("stores/pending_redirect") , W = A.get("stores/visitor") , X = A.get("stores/directive") , Q = A.get("stores/event_data") , $ = A.get("stores/visitor_id") , J = "COOKIE" , Z = !0 , ee = 1e3; t.trackClientActivation = function() { if (X.shouldSendTrackingData()) { var e = o(); return g("onClientActivation", e), e } } , t.trackCustomEvent = function(e, t, i) { t = t || {}, i || (i = Q.getByApiName(e)); var r = n(e, t, i) , a = { name: e, type: O.CUSTOM, category: r.eventCategory, tags: v.omit(r.eventTags, "revenue") }; if (v.isUndefined(t.revenue) || (a.revenue = t.revenue), E.emitAnalyticsEvent({ name: i ? i.name || i.apiName : e, apiName: i ? i.apiName : void 0, type: O.CUSTOM, tags: v.omit(r.eventTags, "revenue"), category: r.eventCategory, metrics: a.revenue ? { revenue: a.revenue } : {} }, !X.shouldSendTrackingData()), X.shouldSendTrackingData()) return I.addEvent(a), g("onCustomEvent", r), r } , t.trackDecisionEvent = function(e, t, i) { i || (i = K.get(e.layerId)); var n = M.generate(); N.dispatch(m.RECORD_LAYER_DECISION_EVENT_ID, { layerId: e.layerId, pageId: t.pageId, decisionId: n }); var r = s(n, e, t, i) , a = q.isExpectingRedirect() , o = q.getLayerId() , c = C.description(i); if (a && o === i.id && (k.persist(r, J), L.log("Relaying decision for redirect Campaign", c)), !X.shouldSendTrackingData()) return void L.log("Analytics / Not tracking decision for Campaign", C.description(i)); var l = u(r, e.isLayerHoldback); if (a && o === i.id) { var d = x.TrackLayerDecisionTimingFlags.preRedirectPolicy; l.timing = d, h(d, [x.PreRedirectPolicies.PERSIST_BEFORE_AND_TRACK_DURING_REDIRECT], l), L.log("Called trackLayerDecision for redirect Campaign", c, l) } else { var d = x.TrackLayerDecisionTimingFlags.nonRedirectPolicy; l.timing = d, h(d, [x.NonRedirectPolicies.TRACK_IMMEDIATELY], l), L.log("Called trackLayerDecision for non-redirect Campaign", c, l) } } , t.trackPostRedirectDecisionEvent = function() { if (!X.shouldSendTrackingData()) return P.resolve(); if (Y.hasTracked()) return P.resolve(); var e = Y.get(); if (!e) return P.resolve(); var t = u(e, !1) , i = x.TrackLayerDecisionTimingFlags.postRedirectPolicy; if (t.timing = i, h(i, [x.PostRedirectPolicies.TRACK_IMMEDIATELY], t), Z) { var n = new P(function(e) { var t = D.on({ filter: { type: b.TYPES.LIFECYCLE, name: "originsSynced" }, handler: function() { e(), D.off(t) } }) } ) , r = F.makeTimeoutPromise(ee); return P.race([n, r]).then((function() { L.log("Calling trackers after successful sync") } ), (function(e) { L.warn("Calling trackers after failed sync:", e) } )).then((function() { t = u(e, !1), t.timing = x.TrackLayerDecisionTimingFlags.postRedirectPolicy, h(x.TrackLayerDecisionTimingFlags.postRedirectPolicy, [x.PostRedirectPolicies.TRACK_AFTER_SYNC], t), N.dispatch(m.REGISTER_TRACKED_REDIRECT_DATA) } ))["catch"]((function(e) { L.error("Error when calling trackers after sync:", e) } )) } return h(x.TrackLayerDecisionTimingFlags.postRedirectPolicy, [x.PostRedirectPolicies.TRACK_AFTER_SYNC], t), N.dispatch(m.REGISTER_TRACKED_REDIRECT_DATA), P.resolve() } , t.trackClickEvent = function(e) { var t = a(e) , i = { name: e.apiName, type: e.eventType, category: t.eventCategory, tags: t.eventTags }; if (E.emitAnalyticsEvent({ name: e.name || e.apiName, apiName: e ? e.apiName : void 0, type: e.eventType, category: t.eventCategory, tags: t.eventTags, metrics: {} }, !X.shouldSendTrackingData()), X.shouldSendTrackingData()) return I.addEvent(i), g("onClickEvent", t), t } , t.trackViewActivation = function(e, t) { if (t || (t = z.getViewState(e.id)), !t.isActive) return void L.debug("Inactive view passed to `trackViewActivation`"); var i = r(e, t); return E.emitAnalyticsEvent({ name: e.name || i.pageApiName, apiName: i.pageApiName, type: O.PAGEVIEW, category: i.viewCategory, tags: i.eventTags, metrics: {} }, !X.shouldSendTrackingData()), X.shouldSendTrackingData() ? (I.addEvent({ name: i.pageApiName, type: O.PAGEVIEW, category: i.viewCategory, tags: i.eventTags }), N.dispatch(m.TRACK_VIEW_ACTIVATED_EVENT, { pageId: e.id, eventData: i }), g("onPageActivated", i), i) : void 0 } } ), (function(e, t) { t.TYPES = { ACTION: "action", ANALYTICS: "analytics", EDITOR: "editor", LIFECYCLE: "lifecycle" } } ), (function(e, t) { e.exports = { CLICK: "click", CUSTOM: "custom", ENGAGEMENT: "engagement", PAGEVIEW: "pageview" } } ), (function(e, t, i) { var n = i(2) , r = i(7) , a = i(24) , o = i(16) , s = i(9) , u = o.get("stores/global") , c = o.get("stores/session") , l = 2e3; t.recordLayerDecision = function(e, t, i) { return s.dispatch(r.RECORD_LAYER_DECISION, { layerId: e, decision: i, decisionTicket: t, sessionId: c.getSessionId(), activationId: u.getActivationId(), timestamp: a.now(), revision: u.getRevision(), namespace: u.getNamespace(), pageId: t.pageId }), i } , t.relatedAudienceIds = function(e) { var t = {} , i = ["and", "or", "not"]; return n.each(e.experiments, (function(e) { n.each(n.flattenDeep(e.audienceIds), (function(e) { n.includes(i, e) || (t[e] = !0) } )) } )), n.keys(t) } , t.getActivationTimeout = function(e) { var t = e.activation; return t && null !== t.timeout && void 0 !== t.timeout ? t.timeout : l } , t.description = function(e) { return (e.name ? '"' + e.name + '" ' : "") + "(" + e.id + ")" } , t.createSingle = function(e, t, i) { var n = { id: e, policy: "single_experiment", holdback: 0, experiments: [{ id: t || "", variations: [{ id: i || "", actions: [] }] }] }; return n } , t.createLayerState = function(e, t, i, n) { var r = { layerId: e, decision: { layerId: e, experimentId: t, variationId: i, isLayerHoldback: n || !1 }, decisionTicket: { audienceIds: [] } }; return r } , t.getIntegrationTypes = function(e) { return n.keys(n.reduce(n.keys(e.integrationSettings), (function(e, t) { return n.isNaN(Number(t)) || (t = "custom"), e[t] = 1, e } ), {})) } } ), (function(e, t, i) { function n(e) { try { var t = r(e) } catch (e) { return v.error("Relay / Error computing redirect relay cookie: ", e), void g.emitError(e) } v.debug("Relay / Setting redirect relay cookie:", t); try { f.set(h.COOKIES.REDIRECT, t, { maxAge: 5, encodeValue: !1 }) } catch (e) { v.error("Relay / Failed to set redirect relay cookie", e), g.emitError(e) } } function r(e) { var t = [] , i = l.reduce(e, (function(e, i, n) { var r = S[n]; return r ? (r.isMulti ? l.forEach(i, (function(t, i) { t = r.valueToValueString ? r.valueToValueString(t, i) : String(t), l.isNull(t) || (t = (r.encodeValueString || encodeURIComponent)(t), e.push(encodeURIComponent(r.relayName + I + i) + "=" + t)) } )) : l.isNull(i) || (i = (r.valueToValueString || String)(i), i = (r.encodeValueString || encodeURIComponent)(i), e.push(r.relayName + "=" + i)), e) : (t.push(n), e) } ), []); if (t.length) throw new Error("Relay / Don't know how to relay some fields:",t); return i.sort(), i.join("&") } function a() { var e = f.get(h.COOKIES.REDIRECT, !1); if (e) return v.log("Relay / Found redirect cookie:", e), e } function o(e) { var t = {} , i = e.split("&"); return l.forEach(i, (function(e) { var i = e.split("="); if (2 !== i.length) return void v.warn("Relay / Skipping invalid segment:", e); var n = f.safeDecodeURIComponent(i[0]) , r = A[n]; if (!r && (r = l.find(y, (function(e) { return e.isMulti && 0 === n.indexOf(e.relayName + I) } )), !r)) return void v.warn("Relay / Skipping segment with unknown field identifier:", e, n); var a = i[1]; try { if (r.isMulti) { t[r.name] = t[r.name] || {}; var o = n.substring(r.relayName.length + I.length); a = (r.decodeValueString || f.safeDecodeURIComponent)(a), a = (r.valueFromValueString || l.identity)(a, o), t[r.name][o] = a } else a = (r.decodeValueString || f.safeDecodeURIComponent)(a), a = (r.valueFromValueString || l.identity)(a), t[r.name] = a } catch (t) { return v.warn("Relay / Skipping segment due to decode or parse error:", e, t), void g.emitError(t) } } )), t } function s(e, t) { var i = null; if (e) { var n = E.getPlugin(h.PluginTypes.analyticsTrackers, t); if (n && l.isFunction(n.serializeSettings)) try { i = n.serializeSettings(e) } catch (e) { v.warn("Analytics / Failed to persist integrationSettings for plugin:", t, e) } } return i } function u(e, t) { var i = null , n = E.getPlugin(h.PluginTypes.analyticsTrackers, t); if (n && l.isFunction(n.deserializeSettings)) try { i = n.deserializeSettings(e) } catch (e) { v.warn("Analytics / Failed to persist integrationSettings for plugin:", t, e) } return i } function c(e) { var t = e.pageId || void 0; _.dispatch(d.RECORD_LAYER_DECISION, { layerId: e.layerId, decision: { layerId: e.layerId, experimentId: e.experimentId, variationId: e.variationId, isLayerHoldback: !1 }, decisionTicket: { audienceIds: e.decisionTicketAudienceIds, bucketingId: e.visitorId, globalHoldback: 0, preferredVariationMap: void 0, pageId: t, activationId: e.activationId }, sessionId: e.sessionId, activationId: e.activationId, timestamp: e.timestamp, revision: e.revision, namespace: e.namespace, pageId: t }), _.dispatch(d.RECORD_LAYER_DECISION_EVENT_ID, { layerId: e.layerId, pageId: t, decisionId: e.decisionId }), _.dispatch(d.ACTION_EXECUTED, { sessionId: e.sessionId, layerId: e.layerId, pageId: e.pageId, timestamp: e.timestamp, activationId: e.activationId }) } var l = i(2) , d = i(7) , f = i(75) , g = i(86) , p = i(16) , h = i(25) , _ = i(9) , v = i(23) , m = i(115) , E = p.get("stores/plugins") , I = "." , y = [{ name: "sessionId", relayName: "s" }, { name: "decisionTicketAudienceIds", relayName: "as", valueToValueString: function(e) { return l.map(e, encodeURIComponent).join(",") }, encodeValueString: l.identity, decodeValueString: l.identity, valueFromValueString: function(e) { return l.map(e.split(","), f.safeDecodeURIComponent) } }, { name: "decisionId", relayName: "d" }, { name: "activationId", relayName: "aId" }, { name: "pageId", relayName: "vId", isNullable: !0 }, { name: "variationId", relayName: "v", isNullable: !0 }, { name: "referrer", relayName: "r" }, { name: "timestamp", relayName: "t", valueFromValueString: Number }, { name: "visitorId", relayName: "i" }, { name: "projectId", relayName: "p" }, { name: "revision", relayName: "n" }, { name: "clientName", relayName: "cN", isNullable: !0 }, { name: "clientVersion", relayName: "cV" }, { name: "namespace", relayName: "ns" }, { name: "accountId", relayName: "a" }, { name: "layerId", relayName: "l" }, { name: "layerName", relayName: "lN", isNullable: !0 }, { name: "layerPolicy", relayName: "lP" }, { name: "experimentId", relayName: "x", isNullable: !0 }, { name: "experimentName", relayName: "xN", isNullable: !0 }, { name: "variationName", relayName: "vN", isNullable: !0 }, { name: "integrationStringVersion", relayName: "isv", valueFromValueString: Number, isNullable: !0 }, { name: "integrationSettings", relayName: "iS", isMulti: !0, valueToValueString: s, valueFromValueString: u, isNullable: !0 }] , S = {} , A = {}; l.forEach(y, (function(e) { S[e.name] = e, A[e.relayName] = e } )), t.persist = function(e, t) { t === m.RedirectRelayMedia.COOKIE ? n(e) : v.error("Relay / Unsupported redirect relay medium: " + t) } , t.load = function(e) { if (e || (e = a()), e) { var t = o(e); if (t) { var i = []; return l.forEach(y, (function(e) { (l.isNull(t[e.name]) || l.isUndefined(t[e.name])) && (e.isNullable ? t[e.name] = null : (delete t[e.name], i.push(e.name))) } )), i.length ? void v.error("Relay / Observed redirect data with missing fields:", i) : (_.dispatch(d.LOAD_REDIRECT_DATA, t), _.dispatch(d.ADD_CLEANUP_FN, { lifecycle: h.Lifecycle.postVisitorProfileLoad, cleanupFn: function() { c(t) } }), t) } } } } ), (function(e, t, i) { var n = i(8); t.TrackLayerDecisionTimingFlags = n({ preRedirectPolicy: null, postRedirectPolicy: null, nonRedirectPolicy: null }), t.PreRedirectPolicies = n({ PERSIST_BEFORE_AND_TRACK_DURING_REDIRECT: null, PERSIST_BEFORE_REDIRECT: null }), t.PostRedirectPolicies = n({ TRACK_IMMEDIATELY: null, TRACK_AFTER_SYNC: null }), t.NonRedirectPolicies = n({ TRACK_IMMEDIATELY: null }), t.RedirectRelayMedia = n({ COOKIE: null }) } ), (function(e, t, i) { var n = i(12).Promise , r = i(40); t.makeTimeoutPromise = function(e) { return new n(function(t, i) { r.setTimeout((function() { i(new Error("Timed out after " + e + " ms")) } ), e) } ) } } ), (function(e, t, i) { function n(e) { var t = ["type", "selector", "attributes", "value"] , i = r.extend({}, e); return i.changeSet = r.map(e.changeSet, (function(e) { return r.pick(l.dereferenceChangeId(e), t) } )), i } var r = i(2) , a = i(16) , o = a.get("stores/audience_data") , s = i(87) , u = i(111) , c = i(96) , l = i(98); t.emitLayerDecided = function(e) { var t = e.decisionTicket ? e.decisionTicket.audienceIds : [] , i = r.map(t, (function(e) { return { id: e, name: o.get(e).name } } )) , n = { type: u.TYPES.LIFECYCLE, name: "layerDecided", data: r.extend(e, { audiences: i }) } , a = l.translateLayerEventToCampaignEvent(n); s.emit(n), s.emit(a) } , t.emitViewActivated = function(e) { var t = { type: u.TYPES.LIFECYCLE, name: "viewActivated", data: e } , i = l.translateViewActivatedToPageActivated(t); s.emit(t), s.emit(i) } , t.emitViewsActivated = function(e) { var t = { type: u.TYPES.LIFECYCLE, name: "viewsActivated", data: e }; s.emit(t) } , t.emitPageDeactivated = function(e) { var t = { type: u.TYPES.LIFECYCLE, name: "pageDeactivated", data: e }; s.emit(t) } , t.emitActivateEvent = function() { s.emit({ type: u.TYPES.LIFECYCLE, name: "activate" }, !0) } , t.emitActivatedEvent = function() { s.emit({ type: u.TYPES.LIFECYCLE, name: "activated" }) } , t.emitInitializedEvent = function() { var e = { type: u.TYPES.LIFECYCLE, name: "initialized" }; window.optimizely && (window.optimizely.initialized = !0), s.emit(e) } , t.emitOriginsSyncedEvent = function() { var e = { type: u.TYPES.LIFECYCLE, name: "originsSynced" }; s.emit(e) } , t.emitActionAppliedEvent = function(e) { var t = { type: e.type, campaignId: e.layerId, pageId: e.pageId, experimentId: e.experimentId, variationId: e.variationId }; c.defineProperty(t, "changes", (function() { return n(e).changeSet } ), "actionAppliedEvent"); var i = { type: u.TYPES.ACTION, name: "applied", data: t }; s.emit(i) } , t.emitActionsForDecisionAppliedEvent = function(e, t) { var i = { decision: e }; c.defineProperty(i, "actions", (function() { return r.map(t, n) } ), "appliedAllForDecisionEvent"); var a = { type: u.TYPES.ACTION, name: "appliedAllForDecision", data: i }; s.emit(a) } , t.emitSendEvents = function() { var e = { type: u.TYPES.ANALYTICS, name: "sendEvents" }; s.emit(e) } , t.emitHoldEvents = function() { var e = { type: u.TYPES.ANALYTICS, name: "holdEvents" }; s.emit(e) } } ), (function(e, t, i) { function n() { var e = Boolean(E.result(window.optimizely, "initialized")); R.dispatch(I.LOAD_DIRECTIVE, { alreadyInitialized: e }) } function r() { R.dispatch(I.LOAD_DIRECTIVE, { mutationObserverAPISupported: N.isMutationObserverAPISupported() }) } function a() { var e = N.getUserAgent() || ""; if (!E.isString(e)) return void w.warn("Directive / userAgent not a string"); e = e.toLowerCase(); var t = ["googlebot", "yahoo! slurp", "bingbot", "bingpreview", "msnbot", "keynote", "ktxn", "khte", "gomezagent", "alertsite", "yottaamonitor", "pingdom.com_bot", "aihitbot", "baiduspider", "adsbot-google", "mediapartners-google", "applebot", "catchpoint", "phantomjs", "moatbot", "facebookexternalhit"] , i = function(t) { if (E.includes(e, t)) return w.warn("Directive / Matches bot:", t), !0 }; E.some(t, i) && (w.log("Directive / Disabling tracking"), R.dispatch(I.LOAD_DIRECTIVE, { trackingDisabled: !0 })) } function o() { var e = S.get(T.COOKIES.OPT_OUT) , t = b.getQueryParamValue(C.OPT_OUT) , i = "You have successfully opted out of Optimizely for this domain." , n = "You are NOT opted out of Optimizely for this domain." , r = "true" === t || "false" === t; if (r) { var a = "true" === t; R.dispatch(I.LOAD_DIRECTIVE, { shouldOptOut: a }), N.alert(a ? i : n) } else e && R.dispatch(I.LOAD_DIRECTIVE, { shouldOptOut: "true" === e }) } function s() { var e = !1 , t = [C.AB_PREVIEW, C.DISABLE]; t.push(C.EDITOR); for (var i = 0; i < t.length; i++) if ("true" === b.getQueryParamValue(t[i])) { w.warn("Directive / Not activating because " + t[i] + " is set."), e = !0; break } R.dispatch(I.LOAD_DIRECTIVE, { disabled: e }) } function u() { R.dispatch(I.LOAD_DIRECTIVE, { isPreview: !1 }) } function c() { var e = b.getQueryParamValue(C.LEGACY_PREVIEW); e && w.log("Directive / Is legacy preview mode"), R.dispatch(I.LOAD_DIRECTIVE, { isLegacyPreview: !!e }) } function l() { R.dispatch(I.LOAD_DIRECTIVE, { isEditor: !1 }) } function d() { R.dispatch(I.LOAD_DIRECTIVE, { isSlave: !1 }) } function f() { var e = N.getGlobal("optlyDesktop") , t = !(!e || E.isUndefined(e["p13nInner"])); t && w.log("Directive / Is running in desktop app editor"), R.dispatch(I.LOAD_DIRECTIVE, { isRunningInDesktopApp: t }) } function g() { var e = "true" === b.getQueryParamValue(C.EDITOR_V2); e && w.log("Directive / Is running in editor"), R.dispatch(I.LOAD_DIRECTIVE, { isRunningInV2Editor: e }) } function p() { var e = S.get(T.COOKIES.TOKEN) || null , t = b.getQueryParamValue(C.TOKEN) || e; R.dispatch(I.LOAD_DIRECTIVE, { projectToken: t }) } function h() { var e = S.get(T.COOKIES.PREVIEW) , t = [] , i = b.getQueryParamValue(C.FORCE_AUDIENCES); if (i) t = S.safeDecodeURIComponent(i).split(","); else if (e) try { var n = O.parse(e); t = n.forceAudienceIds } catch (t) { var r = new D("Failed to parse previewCookie in registerForceAudienceIds: " + e) , a = { originalMessage: t.message, userError: !0 }; y.emitError(r, a) } t.length && w.warn("Directive / Force parameters disabled - ignoring force audience IDs.") } function _() { var e = S.get(T.COOKIES.PREVIEW) , t = [] , i = b.getQueryParamValue(C.FORCE_VARIATIONS); if (i) t = S.safeDecodeURIComponent(i).split(","); else if (e) try { var n = O.parse(e); t = n.forceVariationIds } catch (t) { var r = new D("Failed to parse previewCookie in registerForceVariationIds: " + e) , a = { originalMessage: t.message, userError: !0 }; y.emitError(r, a) } t.length && w.warn("Directive / Force parameters disabled - ignoring force variation IDs.") } function v() { var e = b.getQueryParamValue(C.FORCE_TRACKING); e && R.dispatch(I.LOAD_DIRECTIVE, { forceTracking: e }) } function m() { var e = "OFF" , t = b.getQueryParamValue("optimizely_log"); if (t) { var i = t.split(":"); "" !== i[0] && (e = String(i[0]).toUpperCase()), "undefined" != typeof i[1] && w.setLogMatch(i[1]) } w.setLogLevel(e) } var E = i(2) , I = i(7) , y = i(86) , S = i(75) , A = i(76).create , T = i(25) , R = i(9) , w = i(23) , D = t.JSONParseError = A("JSONParseError") , b = i(119) , O = i(26) , N = i(40) , C = { AB_PREVIEW: "optimizely_show_preview", DISABLE: "optimizely_disable", EDITOR: "optimizely_editor", EDITOR_V2: "optimizely_p13n", FORCE_AUDIENCES: "optimizely_x_audiences", FORCE_VARIATIONS: "optimizely_x", LEGACY_PREVIEW: "optimizely_show_preview", OPT_OUT: "optimizely_opt_out", PREVIEW_LAYER_IDS: "optimizely_preview_layer_ids", TOKEN: "optimizely_token", FORCE_TRACKING: "optimizely_force_tracking" }; t.populateDirectiveData = function() { m(), a(), n(), r(), o(), s(), l(), u(), c(), d(), f(), g(), p(), h(), _(), v() } ; var L = 31536e3; t.setOptOut = function(e) { e ? (w.warn("Directive / Opting out"), S.set(T.COOKIES.OPT_OUT, "true", { maxAge: 10 * L }, !0)) : S.remove(T.COOKIES.OPT_OUT), R.dispatch(I.LOAD_DIRECTIVE, { shouldOptOut: e }) } } ), (function(e, t, i) { var n = i(84) , r = i(40); t.getLanguage = function() { return r.getNavigatorLanguage() } , t.getQueryParams = n.getQueryParams, t.getQueryParamValue = n.getQueryParamValue, t.getUrl = function() { return r.getHref() } } ), (function(e, t, i) { function n(e) { return e && e.engine ? e.engine : _ ? "edge-tracking" : h ? "edge-helper" : f.getClientName() } var r = i(2) , a = i(76).BaseError , o = i(24) , s = i(16) , u = i(80) , c = i(23) , l = i(40) , d = i(91) , f = s.get("stores/client_metadata") , g = s.get("stores/global") , p = "https://errors.client.optimizely.com" , h = !1 , _ = !1; t.handleError = function(e, t) { function i() { return d.request({ url: p + "/log", method: "POST", data: v, contentType: "application/json" }).then((function(e) { c.log("Error Monitor / Logged error with response: ", e) } ), (function(e) { c.error("Failed to log error, response was: ", e) } )) } var s = e.name || "Error" , h = e.message || "" , _ = e.stack || null; e instanceof a && (h instanceof Error ? (h = h.message, _ = e.message.stack) : _ = null); var v = { timestamp: o.now(), clientEngine: n(t), clientVersion: f.getClientVersion(), accountId: g.getAccountId(), projectId: g.getProjectId(), errorClass: s, message: h, stacktrace: _ } , m = r.map(g.getExperimental(), (function(e, t) { return { key: "exp_" + t, value: String(e) } } )); t && r.forEach(t, (function(e, t) { r.isObject(e) || m.push({ key: t, value: String(e) }) } ), []), r.isEmpty(m) || (v.metadata = m), c.error("Logging error", v), u.isLoaded() ? i() : l.addEventListener("load", i) } } ), (function(e, t, i) { var n = i(2); t.create = function(e, t, i, r) { var a = n.extend({ category: "other" }, r, { id: e, apiName: t, eventType: i }); return a } } ), (function(e, t, i) { var n = i(2) , r = i(7) , a = i(16) , o = i(25) , s = i(87) , u = i(9); t.registerApiModule = function(e, t) { n.isArray(t) && (t = a.evaluate(t)), u.dispatch(r.REGISTER_PLUGIN, { type: o.PluginTypes.apiModules, name: e, plugin: t }) } , t.registerDependency = function(e, t) { var i = a.get(e); i || a.register(e, t) } , t.registerVisitorProfileProvider = function(e) { u.dispatch(r.REGISTER_PLUGIN, { type: o.PluginTypes.visitorProfileProviders, name: e.provides, plugin: e }) } , t.registerViewProvider = function(e) { u.dispatch(r.REGISTER_PLUGIN, { type: o.PluginTypes.viewProviders, name: e.provides, plugin: e }) } , t.registerAudienceMatcher = function(e, t) { u.dispatch(r.REGISTER_PLUGIN, { type: o.PluginTypes.audienceMatchers, name: e, plugin: t }) } , t.registerViewMatcher = function(e, t) { u.dispatch(r.REGISTER_PLUGIN, { type: o.PluginTypes.viewMatchers, name: e, plugin: t }) } , t.registerAnalyticsTracker = function(e, t) { u.dispatch(r.REGISTER_PLUGIN, { type: o.PluginTypes.analyticsTrackers, name: e, plugin: t }) } , t.registerViewTagLocator = function(e, t) { u.dispatch(r.REGISTER_PLUGIN, { type: o.PluginTypes.viewTagLocators, name: e, plugin: t }) } , t.registerAudiencePlugin = function(e) { e.dependencies && n.each(e.dependencies, (function(e, i) { t.registerDependency(i, e) } )); var i, r = "vendor." + e.vendor; i = n.isString(e.provider) ? a.get(e.provider)(e.vendor) : n.isFunction(e.provider) ? e.provider(e.vendor) : n.cloneDeep(e.provider), t.registerVisitorProfileProvider(n.extend(i, { provides: r })); var o; o = n.isString(e.matcher) ? a.get(e.matcher) : e.matcher; var s = { fieldsNeeded: [r], match: function(e, t) { return o(e[r], t) } }; t.registerAudienceMatcher(r, s) } , t.registerWidget = function(e) { n.isArray(e) && (e = a.evaluate(e)); var t = s.on({ filter: { type: "showWidget", name: e.widgetId }, handler: e.showFn }) , i = s.on({ filter: { type: "hideWidget", name: e.widgetId }, handler: e.hideFn }); return { showToken: t, hideToken: i } } , t.registerChangeApplier = function(e, t) { u.dispatch(r.REGISTER_PLUGIN, { type: o.PluginTypes.changeAppliers, name: e, plugin: t }) } , t.registerDecider = function(e, t) { u.dispatch(r.REGISTER_PLUGIN, { type: o.PluginTypes.deciders, name: e, plugin: t }) } , t.registerEventImplementation = function(e, t) { u.dispatch(r.REGISTER_PLUGIN, { type: o.PluginTypes.eventImplementations, name: e, plugin: t }) } , t.registerViewTrigger = function(e, t) { u.dispatch(r.REGISTER_PLUGIN, { type: o.PluginTypes.viewTriggers, name: e, plugin: t }) } } ), (function(e, t, i) { function n(e, t) { r.forEach(e, (function(e) { if (e.eventType !== d.CUSTOM) { var i = _.getPlugin(l.PluginTypes.eventImplementations, e.eventType); i ? t ? i.attach(e) : i.detach(e) : g.warn("No implementation found for event type:", e.eventType, "needed for event:", e) } } )) } var r = i(2) , a = i(7) , o = i(117) , s = i(124) , u = i(24) , c = i(16) , l = i(25) , d = i(112) , f = i(9) , g = i(23) , p = i(125) , h = c.get("stores/event_data") , _ = c.get("stores/plugins") , v = c.get("stores/rum") , m = c.get("stores/view") , E = c.get("stores/view_data"); t.parseViewTags = function(e) { var i = t.evaluateViewTags(e); t.setParsedViewTags(e.id, i) } , t.updateAllViewTags = function() { var e = m.getActiveViewStates(); r.each(e, (function(e) { var i = E.get(e.id); t.parseViewTags(i) } )) } , t.evaluateViewTags = function(e) { if (!e.tags) return {}; var t = r.reduce(e.tags, (function(e, t) { try { e[t.apiName] = p.getTagValue(t) } catch (e) { e instanceof p.Error ? g.warn("Page / Ignoring unparseable tag", t, e) : g.error(e) } return e } ), {}); return t } , t.createViewTicket = function() { var e = {}; return r.each(_.getAllPlugins(l.PluginTypes.viewProviders), (function(t) { e[t.provides] = c.evaluate(t.getter) } )), e } , t.registerViews = function(e) { f.dispatch(a.REGISTER_VIEWS, { views: e }) } , t.activateViaAPI = function(e, i) { i && t.setUserSuppliedViewTags(e.id, i), t.activateMultiple([e], i) } , t.getViewsAndActivate = function(e) { var i = E.getAllViewsForActivationType(e); t.activateMultiple(i) } , t.activateMultiple = function(e, i) { var s = []; return r.each(e, (function(e) { var u, c = m.getViewState(e.id), d = t.createViewTicket(); if (c.isActive) if (e.deactivationEnabled) try { t.hasValidStaticConditions(e, d) || t.deactivate(e) } catch (i) { g.error("Page / Error evaluating whether to deactivate page ", t.description(e), i) } else g.log("Not activating Page, already active ", t.description(e)); else { try { if (u = t.hasValidStaticConditions(e, d), !u) return r.isBoolean(c.isActive) || t.setViewActiveState(e, !1), void g.log("Page / Failed to match page conditions for " + t.description(e), e.staticConditions) } catch (i) { return r.isBoolean(c.isActive) || t.setViewActiveState(e, !1), void g.error("Page / Error evaluating whether to activate page ", t.description(e), i) } if (s.push(e), t.setViewActiveState(e, !0), g.log("Activated Page", t.description(e)), o.emitViewActivated({ view: e, metadata: i }), v.getSampleRum()) { var p = e.activationType || l.ViewActivationTypes.immediate; f.dispatch(a.RECORD_ACTIVATION_TYPE_USAGE, { activationType: p, entityId: e.id }) } var _ = h.getByPageId(e.id); n(_, !0) } } )), r.isEmpty(s) || o.emitViewsActivated({ views: s }), s } , t.deactivate = function(e) { var i = m.getViewState(e.id); if (!i.isActive) return void g.log("Not deactivating Page, already inactive ", t.description(e)); t.setViewActiveState(e, !1), g.log("Deactivated Page", t.description(e)), o.emitPageDeactivated({ page: e }); var r = h.getByPageId(e.id); n(r, !1) } , t.setViewActiveState = function(e, t) { f.dispatch(a.SET_VIEW_ACTIVE_STATE, { view: e, timestamp: u.now(), isActive: t }) } , t.setGlobalTags = function(e) { f.dispatch(a.SET_GLOBAL_TAGS, e) } , t.setParsedViewTags = function(e, t) { f.dispatch(a.UPDATE_PARSED_VIEW_METADATA, { pageId: e, metadata: t }) } , t.setUserSuppliedViewTags = function(e, t) { f.dispatch(a.UPDATE_USER_SUPPLIED_METADATA, { pageId: e, metadata: t }) } , t.hasValidStaticConditions = function(e, t) { var i = {}; if (r.isEmpty(e.staticConditions)) return !0; var n = _.getAllPlugins(l.PluginTypes.viewMatchers); g.groupCollapsed("Page / Evaluating staticConditions:", e.staticConditions), g.debug("Matching to current value:", t); var o = s.evaluate(e.staticConditions, (function(e) { var r = e.type , a = n[r]; if (!a) throw new Error("Page / No matcher found for type=" + r); return a && (i[e.type] || (i[e.type] = !0)), a.match(t, e) } )); return g.groupEnd(), v.getSampleRum() && o && f.dispatch(a.RECORD_VIEW_FEATURE_USAGE, { featuresUsed: r.keys(i), entityId: e.id }), o } , t.description = function(e) { return '"' + e.name + '" (' + e.id + ")" } , t.isActivationTypeImmediate = function(e) { return e === l.ViewActivationTypes.immediate || !e } , t.shouldTriggerImmediately = function(e) { return e === l.ViewActivationTypes.DOMChanged || e === l.ViewActivationTypes.URLChanged || e === l.ViewActivationTypes.immediate || !e } , t.create = function(e, t) { var i = { id: e, apiName: t, category: "other" }; return i } , t.createState = function(e) { var t = { id: e, isActive: !0, metadata: {}, parsedMetadata: {}, userSuppliedMetadata: {} }; return t } } ), (function(e, t, i) { function n(e, t) { for (var i, n, r = 0; r < e.length; r++) { if (i = o(e[r], t), i === !1) return !1; s.isUndefined(i) && (n = !0) } if (!n) return !0 } function r(e, t) { for (var i, n = !1, r = 0; r < e.length; r++) { if (i = o(e[r], t), i === !0) return !0; s.isUndefined(i) && (n = !0) } if (!n) return !1 } function a(e, t) { if (1 !== e.length) return !1; var i = o(e[0], t); return s.isUndefined(i) ? void 0 : !i } function o(e, t) { var i; if (s.isArray(e)) { var n, r; e[0]in d ? (n = e[0], r = e.slice(1)) : (n = l.OR, r = e), c.groupCollapsed('Condition / Applying operator "' + n + '" with args', u.stringify(r)); try { i = d[n](r, t), c.debug("Condition / Result:", i) } finally { c.groupEnd() } return i } return i = t(e), c.debug("Condition / Evaluated:", u.stringify(e), ":", i), i } var s = i(2) , u = i(26) , c = i(23) , l = { AND: "and", OR: "or", NOT: "not" } , d = {}; d[l.AND] = n, d[l.OR] = r, d[l.NOT] = a, e.exports = { evaluate: o } } ), (function(e, t, i) { var n = i(25).PluginTypes , r = i(16) , a = r.get("stores/plugins"); t.getTagValue = function(e) { var i = a.getPlugin(n.viewTagLocators, e.locatorType); if (!i) throw new t.Error("No locator registered for tag locatorType: " + e.locatorType); return i(e) } , t.enums = i(126), t.Error = i(127).Error } ), (function(e, t) { t.locatorType = { CSS_SELECTOR: "css_selector", JAVASCRIPT: "javascript", URL_REGEX: "url_regex" }, t.valueType = { STRING: "string", NUMBER: "number", CURRENCY: "currency" }, t.nodeNames = { INPUT: "INPUT", SELECT: "SELECT" } } ), (function(e, t, i) { var n = i(76).create; t.Error = n("TagError") } ), (function(e, t) {} ), (function(e, t, i) { var n = i(16); n.register("env/jquery", i(130)) } ), (function(e, t, i) { var n, r = i(40); try { n = $ } catch (e) {} var a = r.getGlobal("$"); n && n !== a ? e.exports = n : e.exports = a } ), (function(e, t, i) { var n = i(23) , r = i(40) , a = "optimizelyDataApi"; t.registerFunction = function(e, t) { var i = r.getGlobal(a); i || (i = {}, r.setGlobal(a, i)), i[e] || (i[e] = t) } , t.unregisterFunction = function(e) { var t = r.getGlobal(a); t && t[e] && (t[e] = function() { n.log('Ignoring attempt to call "' + a + "." + e + '" which has been unregistered.') } ) } , t.getFunction = function(e) { return r.getGlobal(a)[e] } } ), (function(e, t, i) { var n = i(80) , r = i(23) , a = i(91); t.addScriptAsync = function(e, t) { var i = n.querySelector("head") , a = n.createElement("script"); a.type = "text/javascript", a.async = !0, a.src = e, t && (a.onload = t), i.insertBefore(a, i.firstChild), r.debug("Asynchronously requesting " + e) } , t.addScriptSync = function(e, i) { try { var o = "optimizely_synchronous_script_" + Math.floor(1e5 * Math.random()); if (e.indexOf('"') !== -1) return void r.error("Blocked attempt to load unsafe script: " + e); n.write(''); var s = n.querySelector("#" + o); if (!s) throw new Error("Document.write failed to append script"); s.onload = i, s.onerror = function(n) { r.warn("Failed to load script (" + e + ") synchronously:", n), t.addScriptAsync(e, i) } } catch (n) { r.debug("Document.write failed for " + e + ": " + n.message); var u = function(e) { var t = new Function(e.responseText); t(), i && i() }; return a.request({ url: e, async: !1, contentType: "text/plain", success: u })["catch"]((function(n) { r.error("Failed to load " + e + " via synchronous XHR: " + n.message), t.addScriptAsync(e, i) } )) } } } ), (function(e, t, i) { function n() { var e = null; R.isNumber(e) && 0 === pe.getCount() ? (W.log("Activating after delay of", e, "ms because no Experiments are running"), H.dispatch(O.SET_RUM_DATA, { data: { activateDfd: !0 } }), oe.setTimeout(C.emitActivateEvent, e)) : C.emitActivateEvent() } function r(e) { we.handleError(e.data.error, e.data.metadata) } function a() { R.isArray(window.optimizely) && (window.optimizely = R.filter(window.optimizely, (function(e) { var t = !0; return !Re.push(e, t) } ))) } function o() { var e = i(85) , n = !!ae.getCurrentId() , r = !!n && ae.hasSomeData(); n ? r ? W.log("xd / Existing visitor; has data on this origin") : W.log("xd / Existing visitor; new to this origin") : W.log("xd / New visitor"); var a = fe.getAccountId() , o = "https://a17126690382.cdn.optimizely.com".replace("__SUBDOMAIN__", "a" + a + ".") , u = "/client_storage/a" + a + ".html"; e.subscribe((function(e, t) { ae.checkKeyForVisitorId(e) && q.setItem(e, t) } )); var c = e.fetchAll().then((function(t) { if (!Se.getVisitorIdLocator()) { var i = Te.getCanonicalOrigins(); if (i) { var n = e.getXDomainUserId(t, i); n && (W.log("Syncing cross-origin visitor randomId:", n), ae.maybePersistVisitorId({ randomId: n })) } } return ae.deleteOldForeignData(), t } )).then(t.persistItemsWithId).then((function(e) { if (ae.loadForeignData(), n && !r) { var t = !R.isEmpty(e); W.debug("xd / Loaded foreign data? ", t), s(t) } W.log("Loaded visitor data from foreign origins"), C.emitOriginsSyncedEvent() } ), (function(e) { throw n && !r && (W.debug("xd / Failed to load foreign data:", e), s(!1, e)), e } )); return Z.all([e.load(o, u)["catch"]((function(e) { throw W.debug("xd / Failed to load iframe:", e), n && !r && s(!1, e), e } )), c["catch"]((function(e) { W.debug("xd / Ignored error syncing foreign data (expected if waitForOriginSync used):", e.message), W.debug("xd / Enqueuing sync to happen after visitorId set."), H.dispatch(O.ADD_CLEANUP_FN, { lifecycle: G.Lifecycle.postVisitorProfileLoad, cleanupFn: C.emitOriginsSyncedEvent }) } ))]) } function s(e, t) { H.dispatch(O.SET_RUM_DATA, { data: { extras: { xdAttempt: e, xdError: t ? t.toString() : void 0 } } }) } function u(e) { var t = Ee.getVisitorProfile(); return ae.populateEagerVisitorData(e, t) } function c(e, t, i) { e = e || []; var n = ve.getAllPlugins(G.PluginTypes.visitorProfileProviders) , r = fe.getGlobalHoldbackThreshold() , a = Ee.getVisitorProfile(); ae.populateLazyVisitorData(n, a); var o = Se.getBucketingId(); if (!o) throw new Error("bucketingId not set"); var s, u = Ee.getVisitorProfile(); if (t && !Ne) { var c = Ae.getVariationIdMap(); s = c[t.id] } var l = { bucketingId: o, visitorProfile: u, audiences: e, globalHoldback: r, preferredVariationMap: s, layer: t }; return t && i && F.isPageIdRelevant(t) ? R.map(i, (function(e) { return F.createTicket(R.extend({}, l, { pageId: e })) } )) : [F.createTicket(l)] } function l(e) { return { bucketingId: Se.getBucketingId(), preferredLayerId: Ae.getPreferredLayerMap()[e.id] } } function d(e) { var i = pe.getAllByPageIds(e) , n = de.getForceVariationIds() , r = de.getForceAudienceIds() , a = !R.isEmpty(n); a && W.log("Force variations are in use. Disabling mutual exclusivity."); var o = a ? { individual: i } : R.reduce(i, (function(e, t) { return t.groupId ? e.groups[t.groupId] || (e.groups[t.groupId] = ge.get(t.groupId)) : e.individual.push(t), e } ), { groups: {}, individual: [] }); W.log("Deciding Campaigns/Experiments for Page(s)", e); var s = R.map(o.groups, K.description).join(", "); W.log("Groups:", s); var u = R.map(o.individual, Y.description).join(", "); W.log("Campaigns/Experiments not in Groups (by Campaign id):", u); var c = R.map(o.groups, R.partial(f, n, r, e)) || [] , l = R.map(o.individual, (function(i) { var a = R.filter(i.pageIds, R.partial(R.includes, e)); return t.decideAndExecuteLayerASAP(n, r, a, i) } )) , d = c.concat(l); return Z.all(d).then((function(t) { var i = R.filter(t, (function(e) { return !!e } )); return W.log("All Campaigns/Experiments for Page(s) (by Campaign id)", e, "resolved:", R.map(i, Y.description).join(", ")), i } )) } function f(e, i, n, r) { try { var a = l(r) , o = F.decideGroup(r, a); if (o.reason) return W.debug("Not activating Group", K.description(r), "; reason:", o.reason), me.getSampleRum() && H.dispatch(O.RECORD_LAYER_FEATURE_USAGE, { feature: "mutex", entityId: r.id }), Z.resolve(); var s = pe.get(o.layerId); if (!s) return W.debug("Visitor was bucketed into a Campaign (" + o.layerId + ") which is not in this snippet"), Z.resolve(); var u = R.filter(s.pageIds, R.partial(R.includes, n)); return R.isEmpty(u) ? (W.debug("Not activating Group", K.description(r), "; reason: visitor was bucketed into a Campaign/Experiment not related to the currently-activating Page(s)"), Z.resolve()) : (me.getSampleRum() && H.dispatch(O.RECORD_LAYER_FEATURE_USAGE, { feature: "mutex", entityId: r.id }), t.decideAndExecuteLayerASAP(e, i, u, s)) } catch (e) { return W.error("Error getting decision for Group", K.description(r), "; ", e), Z.reject(e) } } function g(e, t, i, n) { return new Z(function(r, a) { try { _(n, e, t, i, (function(a) { R.each(a, (function(r) { var a = r.pageId ? [r.pageId] : i; W.debug("Deciding layer: ", n, "with decisionTicket: ", r, "and actionViewIds: ", a), p(n, e, t, a, r) } )), r(n) } )) } catch (e) { W.error("Error getting decision for Campaign: " + Y.description(n), e), a(e) } } ) } function p(e, i, n, r, a) { var o = Y.description(e); W.log("Activating Campaign", o, "on Page(s)", r), n.length && (W.log("Applying force audienceIds:", n, "to Campaign", o), a = R.cloneDeep(a), a.audienceIds = n); var s = t.decideLayer(e, a, i) , u = !(!i.length && !n.length) , c = t.getActionsForDecision(e, s, u); T(c.actions, r); if (W.warn("Not preparing actions because LIVE_CHANGES is false"), R.forEach(r, (function() { N.trackDecisionEvent(s, a) } )), C.emitLayerDecided({ layer: e, decisionTicket: a, decision: s }), s.error) throw s.error; if (me.getSampleRum()) { H.dispatch(O.RECORD_LAYER_POLICY_USAGE, { policy: e.policy, layerId: e.id }); var l = h(c.actions); H.dispatch(O.RECORD_CHANGE_TYPE_USAGE, { changeTypes: R.keys(l), layerId: e.id }), R.isEmpty(e.integrationSettings) || H.dispatch(O.RECORD_INTEGRATION_USAGE, { integrations: Y.getIntegrationTypes(e), layerId: e.id }) } return F.isInCohort(s) ? void W.warn("Not executing actions because LIVE_CHANGES is false") : void W.log("Not activating Campaign: " + Y.description(e) + "; not in the cohort because:", s.reason) } function h(e) { var t = {}; return R.each(e, (function(e) { R.each(e.changeSet, (function(e) { t[e.type] || (t[e.type] = !0) } )) } )), t } function _(e, t, i, n, r) { if (t.length || i.length) return void r(c([], void 0, n)); var a = Y.relatedAudienceIds(e) , o = R.reduce(a, (function(e, t) { var i = ue.get(t); return i && e.push(i), e } ), []) , s = ve.getAllPlugins(G.PluginTypes.audienceMatchers); if (me.getSampleRum()) { var u = {}; if (R.each(o, (function(e) { R.extend(u, v(e.conditions, s)) } )), !R.isEmpty(u)) { var l = R.keys(u); H.dispatch(O.RECORD_AUDIENCE_USAGE, { audienceTypes: l, layerId: e.id }) } } I(o, s, Y.getActivationTimeout(e), (function() { var t = c(o, e, n); R.map(t, (function(t) { m(t, o, e) } )), r(t) } )) } function v(e, t) { var i = {}; return R.each(e, (function(e) { R.isArray(e) ? R.extend(i, v(e, t)) : R.isObject(e) && t[e.type] && (i[e.type] = !0) } )), i } function m(e, t, i) { var n = R.map(e.audienceIds, R.bind(ue.get, ue)) , r = R.filter(t, (function(t) { return !R.includes(e.audienceIds, t.id) } )); W.log("When deciding Campaign", Y.description(i), "visitor is in audiences:", E(n), "and not in audiences:", E(r)) } function E(e) { var t = []; return R.each(e, (function(e) { t.push(e.name, e) } )), t } function I(e, t, i, n) { var r = R.reduce(e, (function(e, i) { return R.extend(e, L.requiredAudienceFieldsForConditions(i.conditions, t)) } ), {}) , a = R.reduce(r, (function(e, t) { if (R.isUndefined(ae.getAttribute(t))) { var i = ae.getPendingAttributeValue(t); R.isUndefined(i) || e.push(i) } return e } ), []); if (0 === a.length) return n(); var o = [].concat(e) , s = ee.firstToResolve(R.map(a, (function(e) { return Z.resolve(e).then((function() { var e = Ee.getVisitorProfile(); if (o = R.filter(o, (function(i) { return R.isUndefined(L.isInAudience(e, i, t)) } )), !R.isEmpty(o)) throw new Error("At least one audience is still pending") } )) } ))); Z.race([s, new Z(function(e, t) { oe.setTimeout(t, i) } )]).then((function() { W.log("Activating Campaign after pending Audiences resolved", e), n() } ), (function() { W.log("Activating Campaign after timeout on Audiences", e), n() } )) } function y(e, t, i) { var n, r = Y.description(e); return n = i.length ? F.getDummyLayerDecision(e, i) : F.decideLayer(e, t), W.log("Recording decision for Campaign", r, t, "->", n), Y.recordLayerDecision(e.id, t, n), Ne || (n.variationId && n.experimentId && ae.updateVariationIdMap(e.id, n.experimentId, n.variationId), e.groupId && ae.updatePreferredLayerMap(e.groupId, e.id)), n } function S(e) { var t = le.getCleanupFns(e); if (t.length > 0) { for (; t.length > 0; ) t.shift()(); H.dispatch(O.CLEAR_CLEANUP_FN, { lifecycle: e }) } } function A(e, t, i) { var n = Y.description(e) , r = "NOT applying changes for Campaign" , a = { actions: [], maybeExecute: !1 }; return a.actions = [].concat(ce.getLayerActions(t.layerId) || [], ce.getExperimentActions(t.experimentId) || [], ce.getExperimentVariationActions(t.experimentId, t.variationId) || []), !i && fe.isGlobalHoldback() ? (W.log(r, n, "(visitor is in global holdback)"), a) : t.isLayerHoldback ? (W.log(r, n, "(visitor is in layer holdback)"), a) : t.experimentId && t.variationId ? (a.maybeExecute = !0, W.log("Got Actions for Campaign:", n, a.actions), a) : (W.log(r, n, "(visitor is not eligible for any Experiments)"), a) } function T(e, t) { return R.filter(e, (function(e) { return R.isUndefined(e.pageId) || R.includes(t, e.pageId) } )) } var R = i(2) , w = i(76).create , D = t.ActivationCodeError = w("ActivationCodeError") , b = t.ProjectJSError = w("ProjectJSError") , O = (i(134), i(7)) , N = i(110) , C = i(117) , L = i(138) , P = i(86) , V = i(109) , k = i(24) , F = i(139) , x = i(16) , M = i(118) , U = i(80) , G = i(25) , B = i(87) , z = i(111) , j = i(144) , H = i(9) , K = i(143) , Y = i(113) , q = i(81).LocalStorage , W = i(23) , X = i(145) , Q = i(83) , $ = i(122) , J = i(88) , Z = i(12).Promise , ee = i(146) , te = i(114) , ie = i(116) , ne = i(136) , re = i(123) , ae = i(74) , oe = i(40) , x = i(16) , se = x.get("stores/session") , ue = x.get("stores/audience_data") , ce = x.get("stores/action_data") , le = x.get("stores/cleanup") , de = x.get("stores/directive") , fe = x.get("stores/global") , ge = x.get("stores/group_data") , pe = x.get("stores/layer_data") , he = x.get("stores/layer") , _e = x.get("stores/pending_events") , ve = x.get("stores/plugins") , me = x.get("stores/rum") , Ee = x.get("stores/visitor") , Ie = x.get("stores/view_data") , ye = x.get("stores/view") , Se = x.get("stores/visitor_id") , Ae = x.get("stores/visitor_bucketing") , Te = x.get("stores/xdomain") , Re = i(93) , we = i(120) , De = i(1) , be = 1e3 , Oe = !1 , Ne = !1 , Ce = !1 , Le = Ne || Ce , Pe = 1e3 , Ve = t; t.initialize = function(e) { var i = e.clientData; if (V.normalizeClientData(e.clientData), B.on({ filter: { type: "error" }, handler: r }), H.dispatch(O.DATA_LOADED, { data: i }), W.log("Initialized with DATA:", i), a(), M.setOptOut(de.shouldOptOut()), de.isDisabled() || de.shouldOptOut()) return void W.log("Controller / Is disabled"); if (De.queueBeacons(), U.isReady() ? H.dispatch(O.SET_DOMCONTENTLOADED) : U.addReadyHandler((function() { H.dispatch(O.SET_DOMCONTENTLOADED) } )), !Le) { Q.time("projectJS"); var o = fe.getProjectJS(); if (R.isFunction(o)) try { j.apply(o) } catch (e) { W.error("Error while executing projectJS: ", e), P.emitError(new b(e)) } Q.timeEnd("projectJS") } R.each(e.plugins || [], (function(e) { try { e($) } catch (e) { P.emitInternalError(e) } } )), R.each(fe.getPlugins() || [], (function(e) { try { j.apply(e, [$]) } catch (e) { P.emitError(e) } } )), te.load(); var s = B.on({ filter: { type: "lifecycle", name: "activated" }, handler: function() { Ee.observe(ae.persistVisitorProfile), he.observe(ae.persistLayerStates), se.observe(ae.persistSessionState), _e.observe(X.persistPendingEvents), Ne || Ae.observe(ae.persistVisitorBucketingStore), B.off(s) } }); B.on({ filter: { type: "lifecycle", name: "viewsActivated" }, handler: t.onViewsActivated }), B.on({ filter: { type: "lifecycle", name: "pageDeactivated" }, handler: t.onPageDeactivated }), t.initializeApi(); var u = X.getPendingEvents(); if (u && (H.dispatch(O.LOAD_PENDING_EVENTS, { events: u }), X.retryPendingEvents(u)), B.on({ filter: { type: "lifecycle", name: "activate" }, handler: t.activate }), C.emitInitializedEvent(), !de.shouldActivate()) return Z.resolve(); var c = []; if (Te.isDisabled()) n(); else { var l = t.initializeXDomainStorage(); c.push(l); var d = Boolean(Te.getCanonicalOrigins()); if (d) { var f = ie.makeTimeoutPromise(Pe); Z.race([l, f])["catch"]((function(e) { W.error("Failed to initialize xDomain storage: ", e) } )).then(n)["catch"](we.handleError) } else n() } return Z.all(c) } , t.activate = function() { try { var e = []; W.log("Activated client"), S(G.Lifecycle.preActivate); var t = k.now(); H.dispatch(O.ACTIVATE, { activationId: String(t), activationTimestamp: t }); var i = Ie.getAll(); re.registerViews(i), ae.setId(ae.getOrGenerateId()), e.push(N.trackPostRedirectDecisionEvent()), H.dispatch(O.MERGE_VARIATION_ID_MAP, { variationIdMap: ae.getVariationIdMap() }), H.dispatch(O.MERGE_PREFERRED_LAYER_MAP, { preferredLayerMap: ae.getPreferredLayerMap() }), S(G.Lifecycle.postVisitorProfileLoad), e.push(u(ve.getAllPlugins(G.PluginTypes.visitorProfileProviders)).then((function() { W.log("Populated visitor profile") } ))); var n = c() , r = F.decideGlobal(n); W.log("Made global decision", n, "->", r), H.dispatch(O.RECORD_GLOBAL_DECISION, r); var a = N.trackClientActivation(); a ? W.log("Tracked activation event", a) : W.log("Not tracking activation event"); var o = Ve.setUpViewActivation(i) , s = []; return Oe ? s = re.activateMultiple(o) : R.each(o, (function(e) { s = s.concat(re.activateMultiple([e])) } )), Ne && me.getSampleRum() && H.dispatch(O.RECORD_VIEWS_INITIALLY_ACTIVATED_COUNT, { viewsInitiallyActivatedCount: s.length }), S(G.Lifecycle.postViewsActivated), S(G.Lifecycle.postActivate), C.emitActivatedEvent(), Z.all(e).then((function() { B.emit({ type: z.TYPES.LIFECYCLE, name: "activateDeferredDone" }), W.log("All immediate effects of activation resolved") } ), P.emitError) } catch (e) { return P.emitError(e), Z.reject(e) } } , Ve.setUpViewActivation = function(e) { var t = []; return R.each(e, (function(e) { R.isBoolean(ye.getViewState(e.id).isActive) && re.isActivationTypeImmediate(e.activationType) ? W.debug("Skipping page: already evaluated, presumably at the edge", re.description(e)) : re.shouldTriggerImmediately(e.activationType) ? t.push(e) : e.activationType === G.ViewActivationTypes.callback ? (W.debug("Setting up conditional activation for Page", re.description(e)), Ve.activateViewOnCallback(e)) : e.activationType === G.ViewActivationTypes.polling ? (W.debug("Setting up polling activation for Page", re.description(e)), J.pollFor(R.partial(j.apply, e.activationCode), null, R.partial(ne.isTimedOut, k.now())).then((function() { re.activateMultiple([e]) } ))["catch"]((function(t) { W.warn("Failed to activate view ", e, t) } ))) : e.activationType !== G.ViewActivationTypes.manual && P.emitError(new Error("Unknown view activationType: " + e.activationType)) } )), t } , Ve.activateViewOnCallback = function(e) { var t = function(t) { var i = R.extend({}, t, { pageName: e.apiName, type: "page" }); Re.push(i) } , i = { pageId: e.id }; Object.defineProperty(i, "isActive", { get: function() { return ye.isViewActive(e.id) } }); try { j.apply(e.activationCode, [t, i]) } catch (t) { var n = new D("(" + t.toString() + ") in activationCode for " + re.description(e)); P.emitError(n, { originalError: t, userError: !0 }) } } , t.onViewsActivated = function(e) { var t, i = e.data.views, n = R.map(i, "id"); try { if (!Se.getBucketingId()) throw new Error("View activated with no visitorId set"); var r = d(n)["catch"](P.emitError); return t = Z.all(R.map(i, (function(e) { var t = function() { re.parseViewTags(e); var t = N.trackViewActivation(e); t ? W.log("Tracked activation for Page", re.description(e), t) : W.log("Not Tracking activation for Page", re.description(e)) }; return U.isReady() ? Z.resolve(t()) : J.pollFor(U.isReady, be).then(t) } ))), Z.all([r, t]) } catch (e) { P.emitError(e) } } , t.onPageDeactivated = function(e) { var t = e.data.page , i = ce.getAllActionIdsByPageId(t.id); R.each(i, (function(e) { var i = ce.getActionState(e); i && (R.each(i, (function(e, i) { if (e.cancel) try { e.cancel(), W.debug("Controller / Canceled change", i, "observation due to deactivation of page:", t) } catch (e) { W.error("Controller / Error canceling change", i, "observation upon deactivation of page.", e) } if (t.undoOnDeactivation && e.undo) try { e.undo(), W.debug("Controller / Undid change", i, "due to deactivation of page:", t) } catch (e) { W.error("Controller / Error undoing change upon deactivation of page.", e) } } )), H.dispatch(O.REMOVE_ACTION_STATE, { actionId: e }), W.debug("Controller / Undid changes and/or canceled change observation due to deactivation of page:", t, e)) } )) } , t.initializeApi = function() { var e = { push: Re.push }; Ce || (e.get = Re.get); var t = window.optimizely; R.isArray(t) && R.each(t, (function(t) { e.push(t) } )), e.data = { note: "Obsolete, use optimizely.get('data') instead" }, e.state = {}, window.optimizely = e } , t.persistItemsWithId = function(e) { return R.each(e, (function(e, t) { ae.checkKeyForVisitorId(t) && q.setItem(t, e) } )), e } , t.initializeXDomainStorage = o, t.decideAndExecuteLayerASAP = g, t.decideLayer = y, t.getActionsForDecision = A } ), (function(e, t, i) { function n(e, t, i) { var n = v.getActionState(t.id); if (!n) return void g.warn("Action / Attempted to prepare change for inactive action: ", t); var r = v.getChangeApplier(e.id, t.id); if (!a.isUndefined(r)) return void g.warn("Action / Attempted to prepare a change which is already being applied: ", e); var s = { changeId: e.id, actionId: t.id, changeApplier: I.create(e, t, i) }; f.dispatch(o.SET_CHANGE_APPLIER, s) } function r(e, t, i, o) { if (a.includes(o, t)) return void g.error("Change with id " + t + " has circular dependencies: " + o.concat(t)); if (!e[t]) { var c = m.getChange(t); if (!c) { var d = "Change with id " + t + " is absent"; return o.length && (d += " but listed as a dependency for " + o[o.length - 1]), void g.warn(d) } e[t] = new p(function(d) { var f = a.map(c.dependencies || [], (function(n) { return r(e, n, i, o.concat([t])) } )); if (c.src) { var _ = "change_" + c.src , E = u.makeAsyncRequest(_, (function() { return h.addScriptAsync("https://cdn.optimizely.com/public/17126690382/data" + c.src, (function() { u.resolveRequest(_) } )) } )).then((function() { var e = m.getChange(c.id); e || s.emitError(new S("Failed to load async change from src: " + c.src)), n(e, i, l.now()) } )); f.push(E) } p.all(f).then((function() { var e = l.now() , n = v.getChangeApplier(t, i.id); return n ? (g.debug("Action / Applying change:", c), n.apply().then((function(t) { t ? g.log(t) : g.debug("Action / Applied change for the first time in " + (l.now() - e) + "ms:", c), d() } ))) : (g.debug("Action / Not applying change ", t, " - No changeApplier found."), void d()) } ))["catch"]((function(e) { g.error("Action / Failed to apply change:", c, e), d() } )) } ) } return e[t] } var a = i(2) , o = i(7) , s = i(86) , u = i(6) , c = i(76).create , l = i(24) , d = i(16) , f = i(9) , g = i(23) , p = i(12).Promise , h = i(132) , _ = d.get("stores/global") , v = d.get("stores/action_data") , m = d.get("stores/change_data") , E = d.get("stores/session") , I = i(135) , y = i(136); y.initialize(); var S = c("ActionError"); t.prepareAction = function(e) { g.debug("Action / Preparing:", e), f.dispatch(o.ACTION_EXECUTED, { actionId: e.id, sessionId: E.getSessionId(), layerId: e.layerId, pageId: e.pageId, timestamp: l.now(), activationId: _.getActivationId() }); var t = l.now(); a.forEach(e.changeSet, (function(i) { var r = a.isObject(i) ? i.id : i , s = m.getChange(r); s || (f.dispatch(o.ADD_CHANGE, i), s = m.getChange(i.id)), s.src || n(s, e, t) } )) } , t.executePreparedAction = function(e) { g.debug("Action / Executing:", e); var t = {} , i = a.map(e.changeSet, (function(i) { var n = a.isObject(i) ? i.id : i; return r(t, n, e, []) } )); return p.all(i).then((function() { g.debug("changes for action id=" + e.id + " applied") } )) } } ), (function(e, t, i) { var n = i(13).Promise , r = i(24) , a = i(16) , o = a.get("stores/plugins") , s = i(25) , u = i(23); t.create = function(e, t, i) { var a = { identifier: e.id, action: t, startTime: i || r.now() }; try { var c = o.getPlugin(s.PluginTypes.changeAppliers, e.type); if (!c) throw new Error("Unrecognized change type " + e.type); return new c(e,a) } catch (e) { u.error("Change applier was never properly constructed:", e); var l = { apply: function() { return n.reject(e) } }; return l } } } ), (function(e, t, i) { function n() { "interactive" !== document.readyState && "complete" !== document.readyState || (t.domReadyTime = Date.now()) } var r = i(137) , a = i(16).get("stores/directive"); t.domReadyTime = null, t.initialize = function() { n(), document.addEventListener("readystatechange", n, !0) } , t.isTimedOut = function(e) { var i = Date.now(); if (!t.domReadyTime || !e) return !1; var n = Math.max(e, t.domReadyTime); return a.isEditor() && (n = t.domReadyTime), !(i - n < r.SELECTOR_POLLING_MAX_TIME) } } ), (function(e, t) { e.exports = { SELECTOR_POLLING_MAX_TIME: 2e3, CHANGE_DATA_KEY: "optimizelyChangeData", CHANGE_ID_ATTRIBUTE_PREFIX: "data-optly-" } } ), (function(e, t, i) { function n(e, t) { return function(i) { var n = i.type , a = t[n]; if (!a) throw new Error("Audience / No matcher found for type=" + n); if (a.fieldsNeeded) for (var s = r(a.fieldsNeeded, i), l = 0; l < s.length; l++) { var d = s[l] , f = u.getFieldValue(e, d); if (o.isUndefined(f)) return void c.debug("Audience / Required field", d, "for type", n, "has no value") } c.debug("Matching condition:", i, "to values:", e); var g = a.match(e, i); if (!o.isUndefined(g)) return !!g } } function r(e, t) { var i = "function" == typeof e ? e(t) : e; return o.isString(i) && (i = [i]), o.isArray(i) ? i : (c.warn("Couldn't determine fieldsNeeded for matcher; assuming []"), []) } function a(e) { return e.name ? e.name + " (" + e.id + ")" : e.id } var o = i(2) , s = i(124) , u = i(19) , c = i(23) , l = i(74); t.isInAudience = function(e, t, i) { var r = n(e, i); c.groupCollapsed("Checking audience", t.name, t.id, t), c.debug("Visitor Profile:", e); var o; try { var u = s.evaluate(t.conditions, r) } catch (e) { o = e, u = !1 } return c.groupEnd(), o && c.error("Audience / Error evaluating audience", a(t), ":", o), c.log("Is " + (u ? "in" : "NOT in") + " audience:", a(t)), u } , t.requiredAudienceFieldsForConditions = function e(t, i) { var n = {}; return o.each(t, (function(t) { if (o.isArray(t)) o.extend(n, e(t, i)); else if (o.isObject(t)) { var a = i[t.type]; if (a) { var s = r(a.fieldsNeeded, t); o.each(s, (function(e) { n[l.serializeFieldKey(e)] = e } )) } } } )), n } } ), (function(e, t, i) { function n(e, t) { E.debug("Decision / Deciding layer for group: ", v.description(e)); var i, n, r = t.preferredLayerId, a = !!r; try { i = d.chooseWeightedCandidate(t.bucketingId, e.id, e.weightDistributions), i && "None" !== i || (n = 'Group traffic allocation. Visitor maps to a "hole" in the bucket space left by an experiment or campaign that\'s since been removed from the group') } catch (e) { n = "Group traffic allocation. Visitor maps to a point in the bucket space which has never been covered by any experiment or campaign." } if (a && (E.debug("Decision / Using preferredLayerMap to select layer for group:", v.description(e)), r !== i && (_.dispatch(u.RECORD_STICKY_BUCKETING_FEATURE, { feature: "preferredLayer", id: e.id }), i = r)), n) return { layerId: null, reason: n }; if (!s.find(e.weightDistributions, { entityId: i })) { var o = a ? " sticky-" : " non-sticky " , c = "Visitor was" + o + "bucketed into a campaign (" + i + ") which is not in the group"; if (!a) throw new g(c); return { layerId: null, reason: c } } return { layerId: i } } function r(e, t) { for (var i = 0; i < e.experiments.length; i++) for (var n = 0; n < e.experiments[i].variations.length; n++) if (t.indexOf(e.experiments[i].variations[n].id) > -1) return { experimentId: e.experiments[i].id, variationId: e.experiments[i].variations[n].id }; return null } function a(e) { var t = y.getPlugin(h.PluginTypes.deciders, e); if (s.isEmpty(t)) throw new Error("No deciders found for policy: " + e); return t } function o(e, t) { var i = y.getAllPlugins(h.PluginTypes.audienceMatchers); return s.reduce(t, (function(t, n) { return l.isInAudience(e, n, i) && t.push(n.id), t } ), []) } var s = i(2) , u = i(7) , c = i(86) , l = i(138) , d = i(140) , f = i(141) , g = i(142).DecisionError , p = i(16) , h = i(25) , _ = i(9) , v = i(143) , m = i(113) , E = i(23) , I = i(44) , y = p.get("stores/plugins") , S = p.get("stores/global") , A = p.get("stores/layer_data"); t.isPageIdRelevant = function(e) { if (!e) return !1; var t = a(e.policy); return s.isFunction(t.includePageIdInDecisionTicket) ? t.includePageIdInDecisionTicket(e) : t.includePageIdInDecisionTicket === !0 } , t.createTicket = function(e) { var t = s.pick(e, ["bucketingId", "globalHoldback", "preferredVariationMap", "pageId"]); return s.extend(t, { audienceIds: o(e.visitorProfile, e.audiences), activationId: S.getActivationId() }), t } , t.decideGlobal = function(e) { var t = d.isHoldback(e.bucketingId, { id: null, holdback: e.globalHoldback }); return { isGlobalHoldback: t } } , t.decideGroup = n, t.decideLayer = function(e, t) { E.debug("Deciding: ", e, t); var i, n, r = a(e.policy), o = { layerId: e.id, experimentId: null, variationId: null, isLayerHoldback: d.isHoldback(t.bucketingId, e) }; if (s.isEmpty(e.experiments)) throw new g("No experiments in layer."); try { if (r.decideLayer) { E.debug("Decision / Using decider's custom decideLayer."); var u = r.decideLayer(e, t); i = u.experiment, n = u.variation } else E.debug("Decision / Using default decideLayer behavior."), i = r.selectExperiment(e, t.audienceIds, t.bucketingId), n = f.selectVariation(i, t.audienceIds, t.bucketingId, t.activationId, t.preferredVariationMap) } catch (e) { e instanceof g ? o.reason = e.message : o.error = e } return o.experimentId = i ? i.id : null, o.variationId = n ? n.id : null, o.error && (o.error.name = "DecisionEngineError", c.emitError(o.error)), o } , t.getDummyLayerDecision = function(e, t) { var i, n = r(e, t); return n ? (E.log("Decision / Applying force variation:", n.variationId, "to Campaign", m.description(e)), i = { layerId: e.id, variationId: n.variationId, experimentId: n.experimentId, isLayerHoldback: !1, reason: "force" }) : (E.log("No variation matches ids:", t, "in Campaign", m.description(e)), i = { layerId: e.id, variationId: null, experimentId: null, isLayerHoldback: !1, reason: "force" }), i } , t.isInCohort = function(e) { if (!e.experimentId || !e.variationId) return !1; var t = A.get(e.layerId); return !(I.isSingleExperimentPolicy(t.policy) && e.isLayerHoldback) } } ), (function(e, t, i) { var n = i(64) , r = t.TOTAL_POINTS = 1e4; t.bucketingNumber = function(e, t, i) { var a = n.hashToInt(e + t, i, r); return a } , t.isHoldback = function(e, i) { return t.bucketingNumber(e, i.id, n.Seed.IGNORING) < (i.holdback || 0) } , t.chooseWeightedCandidate = function(e, i, r) { for (var a = t.bucketingNumber(e, i, n.Seed.BUCKETING), o = 0; o < r.length; o++) if (r[o].endOfRange > a) return r[o].entityId; throw new Error("Unable to choose candidate") } } ), (function(e, t, i) { var n = i(2) , r = i(7) , a = i(140) , o = i(124) , s = i(142).DecisionError , u = i(9) , c = i(23) , l = "impression"; t.isValidExperiment = function(e, t) { var i, r = n.partial(n.includes, e); return c.groupCollapsed("Decision / Evaluating audiences for experiment:", t, e), i = !t.audienceIds || o.evaluate(t.audienceIds, r), c.groupEnd(), c.debug("Decision / Experiment", t, "is valid?", i), i } , t.selectVariation = function(e, t, i, o, d) { if (!e.variations || 0 === e.variations.length) throw new s('No variations in selected experiment "' + e.id + '"'); if (!e.weightDistributions && e.variations.length > 1) throw new s('On selected experiment "' + e.id + '", weightDistributions must be defined if # variations > 1'); var f; if (e.bucketingStrategy && e.bucketingStrategy === l) if (1 === e.variations.length) f = e.variations[0].id; else { var g = o; f = a.chooseWeightedCandidate(i + g, e.id, e.weightDistributions) } else if (f = 1 === e.variations.length ? e.variations[0].id : a.chooseWeightedCandidate(i, e.id, e.weightDistributions), d && d[e.id]) { c.debug("Decision / Using preferredVariationMap to select variation for experiment:", e.id); var p = d[e.id]; if (!n.find(e.variations, { id: p })) return u.dispatch(r.RECORD_STICKY_BUCKETING_FEATURE, { feature: "stoppedVariation", id: e.id }), c.debug("Decision / Preferred variation:", p, "not found on experiment:", e.id, ". Visitor not bucketed."), null; p !== f && (u.dispatch(r.RECORD_STICKY_BUCKETING_FEATURE, { feature: "preferredVariation", id: e.id }), f = p) } var h = n.find(e.variations, { id: f }); if (h) return c.debug("Decision / Selected variation:", h), h; throw new s('Unable to find selected variation: "' + f + '".') } , t.getExperimentById = function(e, t) { var i = n.find(e.experiments, { id: t }); if (i) return i; throw new s("Unable to find selected experiment.") } , t.hasVariationActionsOnView = function(e, t) { return c.debug("Decision / Checking variation:", e, "for actions on pageId:", t), !!n.find(e.actions, (function(e) { return e.pageId === t && !n.isEmpty(e.changes) } )) } } ), (function(e, t) { function i(e) { this.message = e } i.prototype = new Error, t.DecisionError = i } ), (function(e, t, i) { function n(e) { return r.map(e.weightDistributions, "entityId") } var r = i(2); t.description = function(e) { var t = !!e.name , i = t ? '"' + e.name + '" ' : "" , r = n(e).join(", "); return i + "(id " + e.id + ", campaigns: " + r + ")" } } ), (function(module, exports, __webpack_require__) { var createError = __webpack_require__(77) , di = __webpack_require__(16) , Logger = __webpack_require__(23) , CSP_MODE = !1 , EXEC_WITH_JQUERY = !0 , ExecError = exports.Error = createError("ExecError"); exports.apply = function(e, t) { t = t || [], EXEC_WITH_JQUERY && (t = t.concat(di.get("env/jquery"))); try { return e.apply(void 0, t) } catch (i) { throw Logger.warn("Error applying function", e, "with args:", t, i), new ExecError(i) } } , exports.eval = function(str) { if (CSP_MODE) throw new ExecError("eval is not supported in CSP mode"); try { return EXEC_WITH_JQUERY && (str = "var $ = optimizely.get('jquery');" + str), eval(str) } catch (e) { throw Logger.warn("Error executing JS:", str, e), new ExecError(e) } } } ), (function(e, t, i) { var n = i(2) , r = i(86) , a = i(25) , o = i(26) , s = i(81).LocalStorage , u = i(23) , c = i(91) , l = i(16) , d = l.get("stores/pending_events") , f = a.StorageKeys.PENDING_EVENTS; t.persistPendingEvents = function() { try { var e = d.getEventsString(); s.setItem(f, e), i(85).setItem(f, e) } catch (e) { u.warn("PendingEvents / Unable to set localStorage key, error was: ", e), r.emitInternalError(e) } } , t.getPendingEvents = function() { try { return o.parse(s.getItem(f)) } catch (e) { return null } } , t.retryPendingEvents = function(e) { n.forOwn(e, (function(e, t) { c.retryableRequest(e.data, t, e.retryCount) } )), n.isEmpty(e) || u.log("Retried pending events: ", e) } } ), (function(e, t, i) { var n = i(2) , r = i(12).Promise; t.firstToResolve = function(e) { return new r(function(t) { n.each(e, (function(e) { r.resolve(e).then(t, (function() {} )) } )) } ) } } ), (function(e, t, i) { function n(e) { var t = !1; if (a.isArray(window.optimizely) && a.each(window.optimizely, (function(i) { a.isArray(i) && "verifyPreviewProject" === i[0] && String(i[1]) === e && (t = !0) } )), !t) throw new Error("Preview projectId: " + e + " does not match expected") } function r() { s.on({ filter: { type: u.TYPES.ANALYTICS, name: "trackEvent" }, handler: f }), s.on({ filter: { type: u.TYPES.LIFECYCLE, name: "viewActivated" }, handler: f }), s.on({ filter: { type: u.TYPES.LIFECYCLE, name: "layerDecided" }, handler: f }), s.on({ filter: { type: "error" }, publicOnly: !0, handler: f }) } var a = i(2) , o = i(16) , s = i(87) , u = i(111) , c = i(40) , l = o.get("stores/directive") , d = "optimizelyPreview" , f = function(e) { var t = c.getGlobal(d); t.push(e) }; t.initialize = function(e) { l.isSlave() && n(e), r() } , t.setupPreviewGlobal = function() { c.getGlobal(d) || c.setGlobal(d, []) } , t.pushToPreviewGlobal = function(e) { f(e) } } ), (function(e, t, i) { e.exports = function(e) { e.registerVisitorProfileProvider(i(149)) } } ), (function(e, t) { e.exports = { provides: "visitorId", getter: ["stores/visitor_id", function(e) { return e.getRandomId() } ] } } ), (function(e, t, i) { e.exports = function(e) { e.registerVisitorProfileProvider(i(151)), e.registerAudienceMatcher("behavior", i(153)) } } ), (function(e, t, i) { var n = i(152); e.exports = { provides: "events", isTransient: !0, getter: [function() { return n.getEvents() } ] } } ), (function(e, t, i) { var n = i(2) , r = i(72) , a = i(16) , o = a.get("stores/visitor_events") , s = 1e3; t.getEvents = function() { var e = r.getEvents() , t = [].concat.apply([], n.values(o.getForeignEvents())) , i = [].concat.apply([], n.values(o.getForeignEventQueues())) , a = r.mergeAllEvents([e, t, i]); return a.slice(a.length - s) } } ), (function(e, t, i) { var n = i(2) , r = i(26) , a = i(154) , o = i(155); e.exports = { fieldsNeeded: ["events"], match: function(e, t) { var i = [] , s = r.parse(t.value); return i = n.isUndefined(s.version) ? [s] : a.buildFromSpecV0_1(s), n.every(i, (function(t) { return o.isSatisfied(t, e.events) } )) } } } ), (function(e, t, i) { function n(e) { return e = (e || "").toString().trim(), g[e] || e } function r(e, t, i) { var n = { where: t }; if (e.count && (n["limit"] = e.count), e.modifier === s.FREQUENCY_FILTERS.MOST_FREQUENT) { var r = s.getFieldKeyPathForSource(e.name, i) , a = s.aggregate("count") , o = s.aggregateField("count") , l = s.groupField(r); return u.extend(n, { select: [{ field: l }], groupBy: s.groupBy([r]), aggregate: [a], orderBy: [{ field: o, direction: "DESC" }] }) } return u.extend(n, { orderBy: [{ field: [c.FIELDS.TIME], direction: "DESC" }] }) } function a(e) { var t = []; if (u.isUndefined(e)) throw new Error("rule is undefined"); if (!u.isObject(e)) throw new Error("rule is not an Object"); "0.2" !== e["version"] && t.push('version: not "0.2"'), e["filter"] && (u.isArray(e["filter"]) ? u.each(e["filter"], (function(e, i) { var n = s.validateFieldKeyPathV0_2(e["field"], s.FieldPurpose.FILTER); n && t.push("filter[" + i + "]: " + n); var r = s.validateComparatorAndValue(e["comparator"], e["value"]); r && t.push("filter[" + i + "]: " + r) } )) : t.push("filter: not an array")); var i = [] , n = []; if (e["sort"] && (e["reduce"] && e["reduce"]["aggregator"] && "nth" !== e["reduce"]["aggregator"] && t.push("sort: superfluous because we can apply aggregator " + l.stringify(e["reduce"]["aggregator"]) + " to unsorted items"), u.isArray(e["sort"]) ? u.each(e["sort"], (function(e, r) { var a = s.validateFieldKeyPathV0_2(e["field"], s.FieldPurpose.SORT); a && t.push("sort[" + r + "]: " + a), e["field"] && "frequency" === e["field"][0] ? i.push(e) : n.push(e); var u = o(e["direction"]); u && t.push("sort[" + r + "]: " + u) } )) : t.push("sort: not an array"), i.length && n.length && t.push('sort: sorting by non-["frequency"] field is pointless because we are going to sort the picked values by ["frequency"]'), i.length && !e["pick"] && t.push('sort: sorting by ["frequency"] is impossible because no values have been picked')), e["pick"]) { e["reduce"] && "count" === e["reduce"]["aggregator"] && t.push('pick: superfluous because we can apply aggregator "count" to raw events'); var r = s.validateFieldKeyPathV0_2(e["pick"]["field"]); r && t.push("pick: " + r) } if (e["reduce"]) { var a = e["reduce"]["aggregator"] , c = "aggregator " + (l.stringify(a) || String(a)) , d = e["reduce"]["n"] , f = "index " + (l.stringify(d) || String(d)); u.includes(["sum", "avg", "max", "min", "count", "nth"], a) || t.push("reduce: " + c + " is unknown"), u.includes(["sum", "avg", "max", "min"], a) && (e["pick"] || t.push("reduce: " + c + " is impossible to use because no values have been picked")), "nth" === a ? ((!u.isNumber(d) || isNaN(d) || parseInt(d, 10) !== d || d < 0) && t.push("reduce: " + f + " is not a non-negative integer (mandated by " + c + ")"), e["sort"] || t.push('reduce: aggregator "nth" is meaningless without a specific sort order')) : u.isUndefined(d) || t.push("reduce: " + f + " is defined (not mandated by " + c + ")") } if (t.length) throw new Error(t.join("\n")) } function o(e) { var t = "direction " + (l.stringify(e) || String(e)); if (!u.includes(["ascending", "descending"], e)) return t + ' is not "ascending" or "descending"' } var s = t , u = i(2) , c = { FIELDS: i(63).FIELDS, FIELDS_V0_2: i(63).FIELDS_V0_2 } , l = i(26) , d = i(23) , f = i(155); s.MILLIS_IN_A_DAY = 864e5, s.aggregateField = function(e, t) { return u.isString(t) && (t = [t]), t = t || f.DEFAULT_FIELD, [f.generateAlias(e, t)] } , s.groupField = function(e) { return u.isString(e) && (e = [e]), e = e || f.DEFAULT_FIELD, [e.join(".")] } ; var g = { "<": "lt", "<=": "lte", ">": "gt", ">=": "gte", "=": "eq", "==": "eq" }; s.fieldComparison = function(e, t, i) { return e = n(e), u.isString(t) && (t = [t]), "exists" === e ? { op: e, args: [{ field: t }] } : { op: e, args: [{ field: t }, { value: i }] } } , s.relativeTimeComparison = function(e, t) { return { op: n(e), args: [{ op: "-", args: [{ eval: "now" }, { field: [c.FIELDS.TIME] }] }, { value: t * s.MILLIS_IN_A_DAY }] } } , s.rangeTimeComparison = function(e) { return u.isArray(e) ? { op: "between", args: [{ field: [c.FIELDS.TIME] }, { value: [e[0] || +new Date(0), e[1] || +new Date] }] } : (d.error("Rule builder", "rangeTimeComparison passed invalid range", e), null) } , s.groupBy = function(e) { for (var t = [], i = 0; i < e.length; i++) t[i] = { field: e[i] }; return t } , s.aggregate = function(e, t) { return u.isString(t) && (t = [t]), t = t || f.DEFAULT_FIELD, { op: e, args: [{ field: t }] } } , s.SOURCE_TYPES = { BEHAVIOR: "events", CUSTOM_BEHAVIOR: "custom_behavior", DCP: "dcp" }, s.FREQUENCY_FILTERS = { MOST_FREQUENT: "most_frequent", LEAST_FREQUENT: "least_frequent" }, s.RECENCY_FILTERS = { MOST_RECENT: "most_recent", LEAST_RECENT: "least_recent" }, s.getFieldKeyPathForSource = function(e, t) { t = t || s.SOURCE_TYPES.BEHAVIOR; var i = []; return u.isString(e) ? (i = [e], t !== s.SOURCE_TYPES.BEHAVIOR || u.includes(u.values(c.FIELDS), e) || (i = [c.FIELDS.OPTIONS, e])) : i = e, i } , s.buildFromSpecV0_1 = function(e) { if (!(e.action || e.filters && 0 !== e.filters.length)) throw new Error('Audience spec must have an "action" field or at least one "filter" ' + l.stringify(e)); var t = s.fieldComparison("gt", c.FIELDS.TIME, 0) , i = [] , n = []; if (e.action && (n.push(s.fieldComparison("eq", c.FIELDS.NAME, e.action.value)), e.action.type && n.push(s.fieldComparison("eq", c.FIELDS.TYPE, e.action.type))), e.time) if ("last_days" === e.time.type) n.push(s.relativeTimeComparison("lte", e.time.days)); else if ("range" === e.time.type) { var a = s.rangeTimeComparison([e.time.start, e.time.stop]); a && n.push(a) } else d.error("Rule builder", 'Audience spec has bad "time" type', e.time.type); if (t = { op: "and", args: n }, e.count && i.push({ where: s.fieldComparison(e.count.comparator, "0", e.count.value), from: { select: [{ field: s.aggregateField("count") }], where: t, aggregate: [s.aggregate("count")] } }), e.filters && u.each(e.filters, (function(r) { var a, o, u = s.getFieldKeyPathForSource(r.name, e.source); if (r.modifier === s.FREQUENCY_FILTERS.MOST_FREQUENT ? (a = s.aggregate("count"), o = s.aggregateField("count")) : r.modifier === s.RECENCY_FILTERS.MOST_RECENT && (a = s.aggregate("max", c.FIELDS.TIME), o = s.aggregateField("max", c.FIELDS.TIME)), a) { var l = u , d = s.groupField(l); i.push({ where: s.fieldComparison(r.comparator, "0", r.value), from: { select: [{ field: d }], where: t, groupBy: s.groupBy([l]), aggregate: [a], orderBy: [{ field: o, direction: "DESC" }], limit: 1 } }) } else n.push(s.fieldComparison(r.comparator, u, r.value)) } )), e.pick) { if (i.length > 0) throw new Error('A "pick" clause must not be specified with "count" or "most_recent", "most_frequent" modifiers' + l.stringify(e)); return [r(e.pick, t, e.source)] } return i.length > 0 ? i : [{ where: t }] } , s.buildFromSpecV0_2 = function(e) { a(e); var t = { where: { op: "and", args: u.map(e["filter"] || [], (function(e) { return "age" === e["field"][0] ? s.relativeTimeComparison(e["comparator"] || "eq", e["value"] / s.MILLIS_IN_A_DAY) : s.fieldComparison(e["comparator"] || "eq", s.convertFieldKeyPathFromSpecV0_2(e["field"]), e["value"]) } )) } }; if (e["reduce"] && "count" === e["reduce"]["aggregator"]) return u.extend(t, { aggregate: [{ op: "count", args: [{ field: ["*"] }] }], select: [{ field: ["_count_*"] }] }); var i = [] , n = []; if (e["sort"] && (u.each(e["sort"], (function(e) { u.includes(["ascending", "descending"], e["direction"]) && (u.includes(["time", "age"], e["field"][0]) && n.push(e), "frequency" === e["field"][0] && i.push(e)) } )), n.length && !i.length && (t["orderBy"] = u.filter(u.map(n, (function(e) { return "time" === e["field"][0] ? { field: s.convertFieldKeyPathFromSpecV0_2(["time"]), direction: "ascending" === e["direction"] ? "ASC" : "DESC" } : "age" === e["field"][0] ? { field: s.convertFieldKeyPathFromSpecV0_2(["time"]), direction: "ascending" === e["direction"] ? "DESC" : "ASC" } : void 0 } ))))), e["pick"] && e["pick"]["field"]) { var r = s.convertFieldKeyPathFromSpecV0_2(e["pick"]["field"]); if (e["reduce"] && u.includes(["avg", "max", "min", "sum"], e["reduce"]["aggregator"])) return u.extend(t, { aggregate: [{ op: e["reduce"]["aggregator"], args: [{ field: r }] }], select: [{ field: [f.generateAlias(e["reduce"]["aggregator"], r)] }] }); t = i.length ? u.extend(t, { groupBy: [{ field: r }], aggregate: [{ op: "count", args: [{ field: ["*"] }] }], orderBy: [{ field: ["_count_*"], direction: "ascending" === i[0]["direction"] ? "ASC" : "DESC" }], select: [{ field: [r.join(".")] }] }) : u.extend(t, { select: [{ field: r }] }) } if (e["reduce"] && "nth" === e["reduce"]["aggregator"]) { var o = e["reduce"]["n"]; if (u.isNumber(o) && o >= 0 && Number(o) === Math.floor(Number(o))) return u.extend(t, { offset: o, limit: 1 }) } return t } , s.convertFieldKeyPathFromSpecV0_2 = function(e) { return "tags" === e[0] && "revenue" === e[1] ? ["r"] : [c.FIELDS_V0_2[e[0]]].concat(e.slice(1)) } , s.FieldPurpose = { FILTER: "filter", SORT: "sort", PICK: "pick" }, s.validateFieldKeyPathV0_2 = function(e, t) { var i = "field " + (l.stringify(e) || String(e)); if (!u.isArray(e) || !u.every(e, u.isString)) return i + " is not an array of strings"; if ("tags" === e[0] && e.length > 2 || "tags" !== e[0] && e.length > 1) return i + " includes too many strings"; if ("tags" === e[0] && e.length < 2) return i + " does not specify an exact tag"; if (e.length < 1) return i + " does not specify a top-level field"; var n = u.keys(c.FIELDS_V0_2) , r = ["age", "frequency"]; return t === s.FieldPurpose.FILTER && (n.push("age"), r = ["frequency"]), t === s.FieldPurpose.SORT && (n = ["time", "age", "frequency"], r = ["name", "type", "category", "tags"]), u.includes(r, e[0]) ? i + " is not supported here" : u.includes(n, e[0]) ? void 0 : i + " is unknown" } , s.validateComparatorAndValue = function(e, t) { var i = "comparator " + (l.stringify(e) || String(e)) , n = "value " + (l.stringify(t) || String(t)); if (!u.isString(e) && !u.isUndefined(e)) return i + " is not a string"; switch (e) { case void 0: case "eq": case "is": case "contains": break; case "lt": case "gt": case "lte": case "gte": if (!u.isNumber(t)) return n + " is not a number (mandated by " + i + ")"; break; case "in": if (!u.isArray(t)) return n + " is not an array (mandated by " + i + ")"; break; case "between": if (!(u.isArray(t) && 2 === t.length && u.isNumber(t[0]) && u.isNumber(t[1]) && t[0] <= t[1])) return n + " is not a pair of increasing numbers (mandated by " + i + ")"; break; case "regex": if (!(u.isString(t) || u.isArray(t) && 2 === t.length && u.isString(t[0]) && u.isString(t[1]))) return n + " is not a pattern string or a [pattern string, flags string] array (mandated by " + i + ")"; break; case "exists": if (!u.isUndefined(t)) return n + " is not undefined (mandated by " + i + ")"; break; default: return i + " is unknown" } } } ), (function(e, t, i) { var n = i(2) , r = i(25) , a = i(23) , o = n.bind(a.log, a) , s = i(24) , u = i(19).getFieldValue , c = i(26) , l = function(e, t, i) { if (e.getValueOrDefault) return e.getValueOrDefault(t, i); if (!n.isArray(t)) return i; var r = u(e, t); return "undefined" == typeof r && (r = i), r } , d = function(e) { return "string" == typeof e ? e.trim().toLowerCase() : e }; t.clause = { WHERE: "where", GROUP_BY: "groupBy", AGGREGATE: "aggregate", HAVING: "having", ORDER_BY: "orderBy", SELECT: "select", OFFSET: "offset", LIMIT: "limit", FROM: "from" }, t.DEFAULT_FIELD = ["*"], t.booleanOperators = { eq: function(e) { var t = n.map(e, d); return t[0] == t[1] }, is: function(e) { return e[0] === e[1] }, gt: function(e) { return e[0] > e[1] }, lt: function(e) { return e[0] < e[1] }, gte: function(e) { return e[0] >= e[1] }, lte: function(e) { return e[0] <= e[1] }, "in": function(e) { var t = n.map(e[1] || [], d); return n.includes(t, d(e[0])) }, between: function(e) { return e[1][0] <= e[0] && e[0] <= e[1][1] }, contains: function(e) { var t = n.map(e, (function(e) { return "string" == typeof e ? e.toLowerCase() : e } )); return (t[0] || "").indexOf(t[1]) !== -1 }, regex: function(e) { try { var t, i; return n.isString(e[1]) ? (t = e[1], i = "i") : (t = e[1][0] || "", i = e[1][1] || ""), new RegExp(t,i).test(e[0]) } catch (e) { return a.error("Rules", 'In operator "regex", error: ' + (e.message || "invalid RegExp /" + [t, i].join("/"))), !1 } }, exists: function(e) { return "undefined" != typeof e[0] }, and: function(e) { return n.every(e, (function(e) { return e } )) }, or: function(e) { return n.some(e, (function(e) { return e } )) }, not: function(e) { return !e[0] } }, t.arithmeticOperators = { "+": function(e) { return (e[0] || 0) + (e[1] || 0) }, "-": function(e) { return (e[0] || 0) - (e[1] || 0) }, "/": function(e) { return (e[0] || 0) / (e[1] || 1) }, "%": function(e) { return (e[0] || 0) % (e[1] || 1) } }, t.aggregateOperators = { sum: function(e, i) { for (var n = e[0] || t.DEFAULT_FIELD, r = 0, a = 0; a < i.length; a++) r += l(i[a], n, 0); return r }, avg: function(e, i) { if (0 === i.length) return 0; for (var n = e[0] || t.DEFAULT_FIELD, r = 0, a = 0; a < i.length; a++) r += l(i[a], n, 0); return r / i.length }, max: function(e, i) { for (var n = e[0] || t.DEFAULT_FIELD, r = Number.NEGATIVE_INFINITY, a = 0; a < i.length; a++) r = Math.max(r, l(i[a], n, Number.NEGATIVE_INFINITY)); return r }, min: function(e, i) { for (var n = e[0] || t.DEFAULT_FIELD, r = Number.POSITIVE_INFINITY, a = 0; a < i.length; a++) r = Math.min(r, l(i[a], n, Number.POSITIVE_INFINITY)); return r }, count: function(e, t) { return t.length } }; var f = { now: function() { return s.now() } } , g = function(e) { return e in t.booleanOperators ? t.booleanOperators[e] : e in t.arithmeticOperators ? t.arithmeticOperators[e] : null } , p = function(e, t) { if (t.hasOwnProperty("value")) return t["value"]; if (t.hasOwnProperty("field")) return l(e, t["field"]); if (t.hasOwnProperty("eval")) return t["eval"]in f ? f[t["eval"]]() : void a.error("Rules", "Unknown function: " + t["eval"]); if (!t["op"]) return void a.error("Rules", "No operator specified: " + c.stringify(t)); var i = g(t["op"]); if (!i) return void a.error("Rules", "Unknown operator: " + t["op"]); var r = n.partial(p, e) , o = t["args"] || [] , s = n.map(o, (function(e) { return r(e) } )); return i(s, e) } , h = function(e, t) { var i = {}; if ("undefined" == typeof e || !n.isArray(e) || 0 === e.length) return i["*"] = { fieldValues: {}, events: t }, i; for (var r = n.map(e, (function(e) { return e["field"] } )), a = 0; a < t.length; a++) { for (var o = t[a], s = [], u = {}, d = 0; d < r.length; d++) { var f = r[d] , g = l(o, f) , p = f.join("."); u[p] = g, s.push(encodeURIComponent(p) + "=" + encodeURIComponent(c.stringify(g))) } var h = s.join("&"); i.hasOwnProperty(h) || (i[h] = { fieldValues: u, events: [] }), i[h].events.push(o) } return i }; t.generateAlias = function(e, t) { return "_" + e + "_" + t.join(".") } ; var _ = function(e, i) { var r = {}; return n.each(i, (function(i, n) { r[n] = {}; for (var o = 0; o < e.length; o++) { var s = e[o] , u = s["op"]; if (u in t.aggregateOperators) { var c = (s["args"] && s["args"][0] || {})["field"] || t.DEFAULT_FIELD , l = t.generateAlias(u, c) , d = t.aggregateOperators[u]([c], i.events); r[n][l] = d } else a.error("Rules", "Unknown aggregate operator " + u) } } )), r } , v = function(e, t) { var i = []; return n.each(e, (function(e, r) { var a = n.extend({}, e.fieldValues) , o = t[r] || {}; n.extend(a, o), i.push(a) } )), i } , m = function(e, t) { return n.isArray(e) ? 0 === e.length ? t : t.sort((function(t, i) { for (var n = 0; n < e.length; n++) { var r = e[n] , a = r["direction"] || "ASC" , o = "ASC" === a ? 1 : -1 , s = r["field"] , u = l(t, s, 0) , c = l(i, s, 0); if (u < c) return -o; if (u > c) return o } return 0 } )) : (o("Rules", "groupBy rule must be an array"), t) }; t.rewrite = function(e) { function i(e, s) { if (n.isArray(e) && ("and" !== e[0] && "or" !== e[0] && "not" !== e[0] && a.error("Rules", "Unexpected operation " + e[0] + ". Continuing optimistically."), e = { op: e[0], args: e.slice(1) }), e.hasOwnProperty("field") || e.hasOwnProperty("value") || e.hasOwnProperty("eval")) return e; if (s && e["op"]in t.aggregateOperators) { var u = (e["args"] && e["args"][0] || {})["field"] || t.DEFAULT_FIELD , c = t.generateAlias(e["op"], u); return c in o || (r.push({ op: e["op"], args: e["args"] }), o[c] = !0), { field: [c] } } for (var l = [], d = e["args"] || [], f = 0; f < d.length; f++) l[f] = i(d[f], s); return { op: e["op"], args: l } } var r = [] , o = {} , s = {}; e.hasOwnProperty(t.clause.WHERE) && (s[t.clause.WHERE] = i(e[t.clause.WHERE], !1)), e.hasOwnProperty(t.clause.HAVING) && (s[t.clause.HAVING] = i(e[t.clause.HAVING], !0)), (e.hasOwnProperty(t.clause.AGGREGATE) || r.length > 0) && (s[t.clause.AGGREGATE] = (e[t.clause.AGGREGATE] || []).concat(r)); for (var u = [t.clause.GROUP_BY, t.clause.ORDER_BY, t.clause.SELECT, t.clause.OFFSET, t.clause.LIMIT], c = 0; c < u.length; c++) e.hasOwnProperty(u[c]) && (s[u[c]] = e[u[c]]); return e.hasOwnProperty(t.clause.FROM) && (s[t.clause.FROM] = t.rewrite(e[t.clause.FROM])), s } ; var E = function(e, i) { i = i || 0; var r = []; if (e.hasOwnProperty(t.clause.WHERE) ? e[t.clause.WHERE]["op"] ? e[t.clause.WHERE]["op"]in t.booleanOperators || r.push("Non-boolean WHERE clause operator") : r.push("Missing WHERE clause operator") : r.push("Missing WHERE clause"), e.hasOwnProperty(t.clause.HAVING) && (e[t.clause.HAVING]["op"] ? e[t.clause.HAVING]["op"]in t.booleanOperators || r.push("Non-boolean HAVING clause operator") : r.push("Missing HAVING clause operator")), e.hasOwnProperty(t.clause.GROUP_BY) && !e.hasOwnProperty(t.clause.AGGREGATE) && r.push("No AGGREGATE clause specified with GROUP_BY clause"), e.hasOwnProperty(t.clause.SELECT)) { var a = e[t.clause.SELECT]; if (n.isArray(a)) for (var o = 0; o < a.length; o++) a[o]["op"] && a[o]["op"]in t.aggregateOperators && r.push('In SELECT clause, aggregate operator "' + a[o]["op"] + '" specified in selector at index ' + o); else r.push("SELECT clause must be an array") } if (e.hasOwnProperty(t.clause.OFFSET)) { var s = e[t.clause.OFFSET]; (!n.isNumber(s) || Number(s) < 0 || Number(s) !== Math.floor(Number(s))) && r.push("OFFSET must be a non-negative integer") } if (e.hasOwnProperty(t.clause.LIMIT)) { var u = e[t.clause.LIMIT]; (!n.isNumber(u) || Number(u) < 0 || Number(u) !== Math.floor(Number(u))) && r.push("LIMIT must be a non-negative integer") } return i > 0 && (r = n.map(r, (function(e) { return "Sub-rule " + i + ": " + e } ))), e.hasOwnProperty(t.clause.FROM) && (r = r.concat(E(e[t.clause.FROM], i + 1))), r } , I = function(e, t) { return n.map(t, (function(t) { return n.map(e, (function(e) { return p(t, e) } )) } )) } , y = function(e, i) { var r = i; if (e.hasOwnProperty(t.clause.FROM) && (a.debug("Evaluating FROM clause:", e[t.clause.FROM]), r = y(e[t.clause.FROM], r), a.debug("Results after FROM:", r)), a.debug("Evaluating WHERE clause:", e[t.clause.WHERE]), r = n.filter(r, (function(i) { return p(i, e[t.clause.WHERE]) } )), a.debug("Results after WHERE:", r), e.hasOwnProperty(t.clause.AGGREGATE)) { a.debug("Evaluating AGGREGATE clause:", e[t.clause.AGGREGATE]); var o = h(e[t.clause.GROUP_BY], r) , s = _(e[t.clause.AGGREGATE], o); r = v(o, s), a.debug("Results after AGGREGATE:", r) } e.hasOwnProperty(t.clause.HAVING) && (a.debug("Evaluating HAVING clause:", e[t.clause.HAVING]), r = n.filter(r, (function(i) { return p(i, e[t.clause.HAVING]) } )), a.debug("Results after HAVING:", r)), e.hasOwnProperty(t.clause.ORDER_BY) && (a.debug("Evaluating ORDER_BY clause:", e[t.clause.ORDER_BY]), r = m(e[t.clause.ORDER_BY], r), a.debug("Results after ORDER_BY:", r)); var u = 0; e.hasOwnProperty(t.clause.OFFSET) && (a.debug("Evaluating OFFSET clause:", e[t.clause.OFFSET]), u = Number(e[t.clause.OFFSET])); var c; return e.hasOwnProperty(t.clause.LIMIT) && (a.debug("Evaluating LIMIT clause:", e[t.clause.LIMIT]), c = u + Number(e[t.clause.LIMIT])), (u > 0 || !n.isUndefined(c)) && (r = r.slice(u, c), a.debug("Results after OFFSET/LIMIT:", r)), e.hasOwnProperty(t.clause.SELECT) && (a.debug("Evaluating SELECT clause:", e[t.clause.SELECT]), r = I(e[t.clause.SELECT], r), a.debug("Results after SELECT:", r)), r }; t.execute = function(e, i) { e = t.rewrite(e), a.shouldLog(r.LogLevel.DEBUG) && a.groupCollapsed("Evaluating Behavioral Rule"), a.debug("Rule:", e, c.stringify(e)), a.debug("Events:", i); var n = E(e); if (n.length > 0) throw new Error("Rule " + c.stringify(e) + " has violations: " + n.join("\n")); var o = y(e, i); return a.debug("Rule result:", o), a.shouldLog(r.LogLevel.DEBUG) && a.groupEnd(), o } , t.isSatisfied = function(e, i) { try { return t.execute(e, i).length > 0 } catch (t) { return a.error("Rules", "Error " + t.toString() + " while evaluating rule " + c.stringify(e)), !1 } } } ), (function(e, t, i) { e.exports = function(e) { e.registerVisitorProfileProvider(i(157)) } } ), (function(e, t, i) { var n = i(2) , r = i(158) , a = i(152) , o = i(26) , s = i(154); e.exports = { provides: "customBehavior", shouldTrack: !0, isLazy: !1, getter: ["stores/global", "stores/visitor_attribute_entity", function(e, t) { var i = e.getProjectId() , u = n.filter(n.map(t.getCustomBehavioralAttributes(i), (function(e) { try { return { id: e.id, granularity: r.GRANULARITY.ALL, rule: s.buildFromSpecV0_2(o.parse(e.rule_json)) } } catch (e) { return } } ))) , c = a.getEvents(); return r.evaluate(u, c) } ] } } ), (function(e, t, i) { function n(e) { if (0 === e.length) return []; for (var t = e.length - 1, i = o.FIELDS.SESSION_ID, n = e[t][i]; t > 0 && n === e[t - 1][i]; ) t--; return e.slice(t) } function r(e, t) { if (0 === e.length || t <= 0) return []; var i = +new Date - t * s.MILLIS_IN_A_DAY; i -= i % s.MILLIS_IN_A_DAY; for (var n = e.length; n > 0 && i <= e[n - 1][o.FIELDS.TIME]; ) n--; return e.slice(n) } var a = i(23) , o = { FIELDS: i(63).FIELDS } , s = i(154) , u = i(155); t.GRANULARITY = { ALL: "all", CURRENT_SESSION: "current_session", LAST_30_DAYS: "last_30_days", LAST_60_DAYS: "last_60_days" }, t.evaluate = function(e, i) { var o = {}; if (0 === i.length) { for (var s = 0; s < e.length; s++) o[e[s].id] = e[s].defaultValue; return o } var c = n(i) , l = r(i, 60); for (s = 0; s < e.length; s++) { var d = e[s] , f = i; d.granularity === t.GRANULARITY.CURRENT_SESSION ? f = c : d.granularity === t.GRANULARITY.LAST_60_DAYS && (f = l); try { var g = f; d.rule && (g = u.execute(d.rule, f)), o[d.id] = d.defaultValue, 1 === g.length ? o[d.id] = g[0][0] || d.defaultValue : a.debug("Behavior / Rule for", d.id, "returned", g.length, "results, expected 1") } catch (e) { a.error("Behavior / Rule for", d.id, "failed with", e.message || "") } } return o } } ), (function(e, t, i) { e.exports = function(e) { e.registerVisitorProfileProvider(i(160)), e.registerAudienceMatcher("first_session", i(161)) } } ), (function(e, t, i) { var n = i(63) , r = i(152) , a = i(19).getFieldValue , o = i(89).CURRENT_SESSION_INDEX; e.exports = { provides: "first_session", shouldTrack: !0, getter: [function() { var e = r.getEvents(); if (e && e.length > 0) { var t = e[0] , i = a(t, [n.FIELDS.SESSION_INDEX]); return i === o } return !0 } ] } } ), (function(e, t) { e.exports = { fieldsNeeded: ["first_session"], match: function(e) { return !!e.first_session } } } ), (function(e, t, i) { e.exports = function(e) { e.registerApiModule("behavior", i(163)) } } ), (function(e, t, i) { function n(e, t) { var i = d.buildFromSpecV0_1(t); if (1 !== i.length) throw new Error("Invalid query descriptor; verify that no aggregators are specified"); return f.execute(i[0], e) } function r(e, t) { return c.map(e, (function(e) { return c.isFunction(e.toObject) ? e.toObject(t) : e } )) } function a(e, t) { if (!e) return ["Descriptor not defined"]; var i = []; return e.count && i.push('Unexpected "count" clause specified'), e.pick && e.pick.modifier && t.indexOf(e.pick.modifier) === -1 && i.push('Invalid "pick" modifier "' + e.pick.modifier + '"'), c.each(e.filters, (function(e) { c.isUndefined(e.modifier) || i.push('Unexpected "filter" modifier "' + e.modifier + '"') } )), i.length > 0 ? i : void 0 } function o(e, t) { var i, o = { revenueAsTag: !1, timeAsTimestamp: !0 }; if (c.isUndefined(t)) return i = l.getEvents(e), r(i, o); if (c.isNumber(t)) { if (t <= 0) throw new Error("Count must be a positive integer, got " + t); return i = l.getEvents(e), r(i.slice(-t), o) } var s = a(t, c.values(d.RECENCY_FILTERS)); if (s) throw new Error(s.join("\n")); return i = l.getEvents(e), r(n(i, t), o) } function s(e, t) { if (t = c.cloneDeep(t) || {}, !t.pick) throw new Error('No "pick" clause provided in query descriptor'); if (!t.pick.name) throw new Error('No field name provided in "pick" clause'); t.pick.modifier = t.pick.modifier || d.FREQUENCY_FILTERS.MOST_FREQUENT; var i = a(t, c.values(d.FREQUENCY_FILTERS)); if (i) throw new Error(i.join("\n")); var r = l.getEvents(e); return n(r, t) } function u(e, t) { var i = d.buildFromSpecV0_2(t) , n = l.getEvents(e) , a = r(f.execute(i, n), { revenueAsTag: !0, timeAsTimestamp: !1 }); return (t.pick || t.reduce && "count" === t.reduce.aggregator) && (a = c.flatten(a)), t.reduce && (a = a[0]), a } var c = i(2) , l = i(152) , d = i(154) , f = i(155); e.exports = ["stores/visitor_events", function(e) { return { getEvents: c.partial(o, e), getByFrequency: c.partial(s, e), query: c.partial(u, e) } } ] } ), (function(e, t, i) { e.exports = function(e) { e.registerDependency("sources/browser_id", i(165)), e.registerVisitorProfileProvider(i(170)), e.registerVisitorProfileProvider(i(171)), e.registerAudienceMatcher("browser_version", i(172)) } } ), (function(e, t, i) { var n = i(166); t.getId = function() { return n.get().browser.id } , t.getVersion = function() { return n.get().browser.version } } ), (function(e, t, i) { var n = i(2) , r = i(167) , a = i(40) , o = i(7) , s = i(16) , u = i(9) , c = s.get("stores/ua_data"); t.get = function() { var e = c.get(); return n.isEmpty(e) && (e = r.parseUA(a.getUserAgent()), u.dispatch(o.SET_UA_DATA, { data: e })), e } } ), (function(e, t, i) { function n(e) { if (e = (e || "").toLowerCase(), e in u) return e; var t = a.keys(u); return a.find(t, (function(t) { var i = u[t]; return a.includes(i, e) } )) || "unknown" } function r(e, t, i) { return t ? t : "unknown" === e ? "unknown" : i ? "mobile" : "desktop_laptop" } var a = i(2) , o = i(168); t.parseUA = function(e) { var t = new o(e) , i = t.getBrowser() , a = t.getOS() , u = t.getDevice() , l = (a.name || "unknown").toLowerCase() , d = (i.name || "unknown").toLowerCase() , f = s(u.type, d, l); return { browser: { id: n(i.name), version: i.version }, platform: { name: l, version: a.version }, device: { model: c[u.model] || "unknown", type: r(d, u.type, f), isMobile: f } } } ; var s = function(e, t, i) { if (a.includes(["mobile", "tablet"], e)) return !0; if (a.includes(["opera mini"], t)) return !0; var n = ["android", "blackberry", "ios", "windows phone"]; return !!a.includes(n, i) } , u = { gc: ["chrome", "chromium", "silk", "yandex", "maxthon", "chrome webview"], edge: ["edge"], ie: ["internet explorer", "iemobile"], ff: ["firefox", "iceweasel"], opera: ["opera", "opera mini", "opera tablet"], safari: ["safari", "mobile safari", "webkit"], ucbrowser: ["uc browser"] } , c = { iPhone: "iphone", iPad: "ipad" } } ), (function(e, t, i) { var n; !(function(r, a) { "use strict"; var o = "0.7.17" , s = "" , u = "?" , c = "function" , l = "undefined" , d = "object" , f = "string" , g = "major" , p = "model" , h = "name" , _ = "type" , v = "vendor" , m = "version" , E = "architecture" , I = "console" , y = "mobile" , S = "tablet" , A = "smarttv" , T = "wearable" , R = "embedded" , w = { extend: function(e, t) { var i = {}; for (var n in e) t[n] && t[n].length % 2 === 0 ? i[n] = t[n].concat(e[n]) : i[n] = e[n]; return i }, has: function(e, t) { return "string" == typeof e && t.toLowerCase().indexOf(e.toLowerCase()) !== -1 }, lowerize: function(e) { return e.toLowerCase() }, major: function(e) { return typeof e === f ? e.replace(/[^\d\.]/g, "").split(".")[0] : a }, trim: function(e) { return e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "") } } , D = { rgx: function(e, t) { for (var i, n, r, o, s, u, l = 0; l < t.length && !s; ) { var f = t[l] , g = t[l + 1]; for (i = n = 0; i < f.length && !s; ) if (s = f[i++].exec(e)) for (r = 0; r < g.length; r++) u = s[++n], o = g[r], typeof o === d && o.length > 0 ? 2 == o.length ? typeof o[1] == c ? this[o[0]] = o[1].call(this, u) : this[o[0]] = o[1] : 3 == o.length ? typeof o[1] !== c || o[1].exec && o[1].test ? this[o[0]] = u ? u.replace(o[1], o[2]) : a : this[o[0]] = u ? o[1].call(this, u, o[2]) : a : 4 == o.length && (this[o[0]] = u ? o[3].call(this, u.replace(o[1], o[2])) : a) : this[o] = u ? u : a; l += 2 } }, str: function(e, t) { for (var i in t) if (typeof t[i] === d && t[i].length > 0) { for (var n = 0; n < t[i].length; n++) if (w.has(t[i][n], e)) return i === u ? a : i } else if (w.has(t[i], e)) return i === u ? a : i; return e } } , b = { browser: { oldsafari: { version: { "1.0": "/8", 1.2: "/1", 1.3: "/3", "2.0": "/412", "2.0.2": "/416", "2.0.3": "/417", "2.0.4": "/419", "?": "/" } } }, device: { amazon: { model: { "Fire Phone": ["SD", "KF"] } }, sprint: { model: { "Evo Shift 4G": "7373KT" }, vendor: { HTC: "APA", Sprint: "Sprint" } } }, os: { windows: { version: { ME: "4.90", "NT 3.11": "NT3.51", "NT 4.0": "NT4.0", 2000: "NT 5.0", XP: ["NT 5.1", "NT 5.2"], Vista: "NT 6.0", 7: "NT 6.1", 8: "NT 6.2", 8.1: "NT 6.3", 10: ["NT 6.4", "NT 10.0"], RT: "ARM" } } } } , O = { browser: [[/(opera\smini)\/([\w\.-]+)/i, /(opera\s[mobiletab]+).+version\/([\w\.-]+)/i, /(opera).+version\/([\w\.]+)/i, /(opera)[\/\s]+([\w\.]+)/i], [h, m], [/(opios)[\/\s]+([\w\.]+)/i], [[h, "Opera Mini"], m], [/\s(opr)\/([\w\.]+)/i], [[h, "Opera"], m], [/(kindle)\/([\w\.]+)/i, /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i, /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i, /(?:ms|\()(ie)\s([\w\.]+)/i, /(rekonq)\/([\w\.]+)*/i, /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark)\/([\w\.-]+)/i], [h, m], [/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i], [[h, "IE"], m], [/(edge)\/((\d+)?[\w\.]+)/i], [h, m], [/(yabrowser)\/([\w\.]+)/i], [[h, "Yandex"], m], [/(puffin)\/([\w\.]+)/i], [[h, "Puffin"], m], [/((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i], [[h, "UCBrowser"], m], [/(comodo_dragon)\/([\w\.]+)/i], [[h, /_/g, " "], m], [/(micromessenger)\/([\w\.]+)/i], [[h, "WeChat"], m], [/(QQ)\/([\d\.]+)/i], [h, m], [/m?(qqbrowser)[\/\s]?([\w\.]+)/i], [h, m], [/xiaomi\/miuibrowser\/([\w\.]+)/i], [m, [h, "MIUI Browser"]], [/;fbav\/([\w\.]+);/i], [m, [h, "Facebook"]], [/headlesschrome(?:\/([\w\.]+)|\s)/i], [m, [h, "Chrome Headless"]], [/\swv\).+(chrome)\/([\w\.]+)/i], [[h, /(.+)/, "$1 WebView"], m], [/((?:oculus|samsung)browser)\/([\w\.]+)/i], [[h, /(.+(?:g|us))(.+)/, "$1 $2"], m], [/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i], [m, [h, "Android Browser"]], [/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i], [h, m], [/(dolfin)\/([\w\.]+)/i], [[h, "Dolphin"], m], [/((?:android.+)crmo|crios)\/([\w\.]+)/i], [[h, "Chrome"], m], [/(coast)\/([\w\.]+)/i], [[h, "Opera Coast"], m], [/fxios\/([\w\.-]+)/i], [m, [h, "Firefox"]], [/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i], [m, [h, "Mobile Safari"]], [/version\/([\w\.]+).+?(mobile\s?safari|safari)/i], [m, h], [/webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i], [[h, "GSA"], m], [/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i], [h, [m, D.str, b.browser.oldsafari.version]], [/(konqueror)\/([\w\.]+)/i, /(webkit|khtml)\/([\w\.]+)/i], [h, m], [/(navigator|netscape)\/([\w\.-]+)/i], [[h, "Netscape"], m], [/(swiftfox)/i, /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i, /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i, /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i, /(links)\s\(([\w\.]+)/i, /(gobrowser)\/?([\w\.]+)*/i, /(ice\s?browser)\/v?([\w\._]+)/i, /(mosaic)[\/\s]([\w\.]+)/i], [h, m]], cpu: [[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i], [[E, "amd64"]], [/(ia32(?=;))/i], [[E, w.lowerize]], [/((?:i[346]|x)86)[;\)]/i], [[E, "ia32"]], [/windows\s(ce|mobile);\sppc;/i], [[E, "arm"]], [/((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i], [[E, /ower/, "", w.lowerize]], [/(sun4\w)[;\)]/i], [[E, "sparc"]], [/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i], [[E, w.lowerize]]], device: [[/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i], [p, v, [_, S]], [/applecoremedia\/[\w\.]+ \((ipad)/], [p, [v, "Apple"], [_, S]], [/(apple\s{0,1}tv)/i], [[p, "Apple TV"], [v, "Apple"]], [/(archos)\s(gamepad2?)/i, /(hp).+(touchpad)/i, /(hp).+(tablet)/i, /(kindle)\/([\w\.]+)/i, /\s(nook)[\w\s]+build\/(\w+)/i, /(dell)\s(strea[kpr\s\d]*[\dko])/i], [v, p, [_, S]], [/(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i], [p, [v, "Amazon"], [_, S]], [/(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i], [[p, D.str, b.device.amazon.model], [v, "Amazon"], [_, y]], [/\((ip[honed|\s\w*]+);.+(apple)/i], [p, v, [_, y]], [/\((ip[honed|\s\w*]+);/i], [p, [v, "Apple"], [_, y]], [/(blackberry)[\s-]?(\w+)/i, /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i, /(hp)\s([\w\s]+\w)/i, /(asus)-?(\w+)/i], [v, p, [_, y]], [/\(bb10;\s(\w+)/i], [p, [v, "BlackBerry"], [_, y]], [/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i], [p, [v, "Asus"], [_, S]], [/(sony)\s(tablet\s[ps])\sbuild\//i, /(sony)?(?:sgp.+)\sbuild\//i], [[v, "Sony"], [p, "Xperia Tablet"], [_, S]], [/android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i], [p, [v, "Sony"], [_, y]], [/\s(ouya)\s/i, /(nintendo)\s([wids3u]+)/i], [v, p, [_, I]], [/android.+;\s(shield)\sbuild/i], [p, [v, "Nvidia"], [_, I]], [/(playstation\s[34portablevi]+)/i], [p, [v, "Sony"], [_, I]], [/(sprint\s(\w+))/i], [[v, D.str, b.device.sprint.vendor], [p, D.str, b.device.sprint.model], [_, y]], [/(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i], [v, p, [_, S]], [/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, /(zte)-(\w+)*/i, /(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i], [v, [p, /_/g, " "], [_, y]], [/(nexus\s9)/i], [p, [v, "HTC"], [_, S]], [/d\/huawei([\w\s-]+)[;\)]/i, /(nexus\s6p)/i], [p, [v, "Huawei"], [_, y]], [/(microsoft);\s(lumia[\s\w]+)/i], [v, p, [_, y]], [/[\s\(;](xbox(?:\sone)?)[\s\);]/i], [p, [v, "Microsoft"], [_, I]], [/(kin\.[onetw]{3})/i], [[p, /\./g, " "], [v, "Microsoft"], [_, y]], [/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i, /mot[\s-]?(\w+)*/i, /(XT\d{3,4}) build\//i, /(nexus\s6)/i], [p, [v, "Motorola"], [_, y]], [/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i], [p, [v, "Motorola"], [_, S]], [/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i], [[v, w.trim], [p, w.trim], [_, A]], [/hbbtv.+maple;(\d+)/i], [[p, /^/, "SmartTV"], [v, "Samsung"], [_, A]], [/\(dtv[\);].+(aquos)/i], [p, [v, "Sharp"], [_, A]], [/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i, /((SM-T\w+))/i], [[v, "Samsung"], p, [_, S]], [/smart-tv.+(samsung)/i], [v, [_, A], p], [/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i, /(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i, /sec-((sgh\w+))/i], [[v, "Samsung"], p, [_, y]], [/sie-(\w+)*/i], [p, [v, "Siemens"], [_, y]], [/(maemo|nokia).*(n900|lumia\s\d+)/i, /(nokia)[\s_-]?([\w-]+)*/i], [[v, "Nokia"], p, [_, y]], [/android\s3\.[\s\w;-]{10}(a\d{3})/i], [p, [v, "Acer"], [_, S]], [/android.+([vl]k\-?\d{3})\s+build/i], [p, [v, "LG"], [_, S]], [/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i], [[v, "LG"], p, [_, S]], [/(lg) netcast\.tv/i], [v, p, [_, A]], [/(nexus\s[45])/i, /lg[e;\s\/-]+(\w+)*/i, /android.+lg(\-?[\d\w]+)\s+build/i], [p, [v, "LG"], [_, y]], [/android.+(ideatab[a-z0-9\-\s]+)/i], [p, [v, "Lenovo"], [_, S]], [/linux;.+((jolla));/i], [v, p, [_, y]], [/((pebble))app\/[\d\.]+\s/i], [v, p, [_, T]], [/android.+;\s(oppo)\s?([\w\s]+)\sbuild/i], [v, p, [_, y]], [/crkey/i], [[p, "Chromecast"], [v, "Google"]], [/android.+;\s(glass)\s\d/i], [p, [v, "Google"], [_, T]], [/android.+;\s(pixel c)\s/i], [p, [v, "Google"], [_, S]], [/android.+;\s(pixel xl|pixel)\s/i], [p, [v, "Google"], [_, y]], [/android.+(\w+)\s+build\/hm\1/i, /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w?)?[\s_]*(?:plus)?)\s+build/i, /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+)?)\s+build/i], [[p, /_/g, " "], [v, "Xiaomi"], [_, y]], [/android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+)?)\s+build/i], [[p, /_/g, " "], [v, "Xiaomi"], [_, S]], [/android.+;\s(m[1-5]\snote)\sbuild/i], [p, [v, "Meizu"], [_, S]], [/android.+a000(1)\s+build/i, /android.+oneplus\s(a\d{4})\s+build/i], [p, [v, "OnePlus"], [_, y]], [/android.+[;\/]\s*(RCT[\d\w]+)\s+build/i], [p, [v, "RCA"], [_, S]], [/android.+[;\/]\s*(Venue[\d\s]*)\s+build/i], [p, [v, "Dell"], [_, S]], [/android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i], [p, [v, "Verizon"], [_, S]], [/android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i], [[v, "Barnes & Noble"], p, [_, S]], [/android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i], [p, [v, "NuVision"], [_, S]], [/android.+[;\/]\s*(zte)?.+(k\d{2})\s+build/i], [[v, "ZTE"], p, [_, S]], [/android.+[;\/]\s*(gen\d{3})\s+build.*49h/i], [p, [v, "Swiss"], [_, y]], [/android.+[;\/]\s*(zur\d{3})\s+build/i], [p, [v, "Swiss"], [_, S]], [/android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i], [p, [v, "Zeki"], [_, S]], [/(android).+[;\/]\s+([YR]\d{2}x?.*)\s+build/i, /android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(.+)\s+build/i], [[v, "Dragon Touch"], p, [_, S]], [/android.+[;\/]\s*(NS-?.+)\s+build/i], [p, [v, "Insignia"], [_, S]], [/android.+[;\/]\s*((NX|Next)-?.+)\s+build/i], [p, [v, "NextBook"], [_, S]], [/android.+[;\/]\s*(Xtreme\_?)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i], [[v, "Voice"], p, [_, y]], [/android.+[;\/]\s*(LVTEL\-?)?(V1[12])\s+build/i], [[v, "LvTel"], p, [_, y]], [/android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i], [p, [v, "Envizen"], [_, S]], [/android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(.*\b)\s+build/i], [v, p, [_, S]], [/android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i], [p, [v, "MachSpeed"], [_, S]], [/android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i], [v, p, [_, S]], [/android.+[;\/]\s*TU_(1491)\s+build/i], [p, [v, "Rotor"], [_, S]], [/android.+(KS(.+))\s+build/i], [p, [v, "Amazon"], [_, S]], [/android.+(Gigaset)[\s\-]+(Q.+)\s+build/i], [v, p, [_, S]], [/\s(tablet|tab)[;\/]/i, /\s(mobile)(?:[;\/]|\ssafari)/i], [[_, w.lowerize], v, p], [/(android.+)[;\/].+build/i], [p, [v, "Generic"]]], engine: [[/windows.+\sedge\/([\w\.]+)/i], [m, [h, "EdgeHTML"]], [/(presto)\/([\w\.]+)/i, /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, /(icab)[\/\s]([23]\.[\d\.]+)/i], [h, m], [/rv\:([\w\.]+).*(gecko)/i], [m, h]], os: [[/microsoft\s(windows)\s(vista|xp)/i], [h, m], [/(windows)\snt\s6\.2;\s(arm)/i, /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s]+\w)*/i, /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i], [h, [m, D.str, b.os.windows.version]], [/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i], [[h, "Windows"], [m, D.str, b.os.windows.version]], [/\((bb)(10);/i], [[h, "BlackBerry"], m], [/(blackberry)\w*\/?([\w\.]+)*/i, /(tizen)[\/\s]([\w\.]+)/i, /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i, /linux;.+(sailfish);/i], [h, m], [/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i], [[h, "Symbian"], m], [/\((series40);/i], [h], [/mozilla.+\(mobile;.+gecko.+firefox/i], [[h, "Firefox OS"], m], [/(nintendo|playstation)\s([wids34portablevu]+)/i, /(mint)[\/\s\(]?(\w+)*/i, /(mageia|vectorlinux)[;\s]/i, /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]+)*/i, /(hurd|linux)\s?([\w\.]+)*/i, /(gnu)\s?([\w\.]+)*/i], [h, m], [/(cros)\s[\w]+\s([\w\.]+\w)/i], [[h, "Chromium OS"], m], [/(sunos)\s?([\w\.]+\d)*/i], [[h, "Solaris"], m], [/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i], [h, m], [/(haiku)\s(\w+)/i], [h, m], [/cfnetwork\/.+darwin/i, /ip[honead]+(?:.*os\s([\w]+)\slike\smac|;\sopera)/i], [[m, /_/g, "."], [h, "iOS"]], [/(mac\sos\sx)\s?([\w\s\.]+\w)*/i, /(macintosh|mac(?=_powerpc)\s)/i], [[h, "Mac OS"], [m, /_/g, "."]], [/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, /(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i, /(unix)\s?([\w\.]+)*/i], [h, m]] } , N = function(e, t) { if ("object" == typeof e && (t = e, e = a), !(this instanceof N)) return new N(e,t).getResult(); var i = e || (r && r.navigator && r.navigator.userAgent ? r.navigator.userAgent : s) , n = t ? w.extend(O, t) : O; return this.getBrowser = function() { var e = { name: a, version: a }; return D.rgx.call(e, i, n.browser), e.major = w.major(e.version), e } , this.getCPU = function() { var e = { architecture: a }; return D.rgx.call(e, i, n.cpu), e } , this.getDevice = function() { var e = { vendor: a, model: a, type: a }; return D.rgx.call(e, i, n.device), e } , this.getEngine = function() { var e = { name: a, version: a }; return D.rgx.call(e, i, n.engine), e } , this.getOS = function() { var e = { name: a, version: a }; return D.rgx.call(e, i, n.os), e } , this.getResult = function() { return { ua: this.getUA(), browser: this.getBrowser(), engine: this.getEngine(), os: this.getOS(), device: this.getDevice(), cpu: this.getCPU() } } , this.getUA = function() { return i } , this.setUA = function(e) { return i = e, this } , this }; N.VERSION = o, N.BROWSER = { NAME: h, MAJOR: g, VERSION: m }, N.CPU = { ARCHITECTURE: E }, N.DEVICE = { MODEL: p, VENDOR: v, TYPE: _, CONSOLE: I, MOBILE: y, SMARTTV: A, TABLET: S, WEARABLE: T, EMBEDDED: R }, N.ENGINE = { NAME: h, VERSION: m }, N.OS = { NAME: h, VERSION: m }, typeof t !== l ? (typeof e !== l && e.exports && (t = e.exports = N), t.UAParser = N) : "function" === c && i(169) ? (n = function() { return N } .call(t, i, t, e), !(n !== a && (e.exports = n))) : r && (r.UAParser = N) } )("object" == typeof window ? window : this) } ), (function(e, t) { (function(t) { e.exports = t } ).call(t, {}) } ), (function(e, t) { e.exports = { provides: "browserId", shouldTrack: !0, isSticky: !0, getter: ["sources/browser_id", function(e) { return e.getId() } ] } } ), (function(e, t) { e.exports = { provides: "browserVersion", getter: ["sources/browser_id", function(e) { return e.getVersion() } ] } } ), (function(e, t, i) { var n = i(173).compareVersion; e.exports = { fieldsNeeded: ["browserVersion", "browserId"], match: function(e, t) { var i = t.value , r = e.browserId , a = e.browserVersion; if (0 === i.indexOf(r)) { var o = i.substr(r.length); return 0 === n(a, o) } return !1 } } } ), (function(e, t, i) { var n = i(2); t.compareVersion = function(e, t) { if (!t) return 0; for (var i = t.toString().split("."), r = e.toString().split("."), a = 0; a < i.length; a++) { if (n.isUndefined(r[a])) return -1; if (isNaN(Number(r[a]))) { if (r[a] !== i[a]) return -1 } else { if (Number(r[a]) < Number(i[a])) return -1; if (Number(r[a]) > Number(i[a])) return 1 } } return 0 } } ), (function(e, t, i) { e.exports = function(e) { e.registerVisitorProfileProvider(i(175)), e.registerAudienceMatcher("campaign", i(176)) } } ), (function(e, t, i) { var n = i(119); e.exports = { provides: "campaign", shouldTrack: !0, isSticky: !0, getter: [function() { return n.getQueryParamValue("utm_campaign") } ] } } ), (function(e, t, i) { var n = i(20); e.exports = { fieldsNeeded: ["campaign"], match: function(e, t) { return n.hasMatch(t.value, t.match, e.campaign) } } } ), (function(e, t, i) { e.exports = function(e) { e.registerVisitorProfileProvider(i(178)); var t = i(179); e.registerAudienceMatcher("custom_attribute", t), e.registerAudienceMatcher("custom_dimension", t) } } ), (function(e, t, i) { var n = i(2) , r = i(25) , a = i(23) , o = i(16) , s = o.get("stores/dimension_data"); e.exports = { provides: "custom", attributionType: r.AttributionTypes.LAST_TOUCH, restorer: function(e) { return n.reduce(e, (function(e, t, i) { var r = i , o = s.getByApiName(i) , u = s.getById(i) , c = u; return n.isObject(t) ? (!t.id && o && (c = o, r = o.id, n.extend(t, { id: c.segmentId || c.id })), t.name || c && c.apiName && (t.name = c.apiName), t.id || c || a.warn("Unable to determine ID for custom attribute:", i, "; segmentation is disabled."), e[r] = t, e) : (a.error('Unable to restore custom attribute "' + i + '" because value is not an object'), e) } ), {}) }, shouldTrack: !0 } } ), (function(e, t, i) { var n = i(2) , r = i(20); t.match = function(e, t) { var i; return e.custom && (i = e.custom[t.name]), n.isObject(i) && (i = i.value), r.hasMatch(t.value, t.match, i) } } ), (function(e, t, i) { e.exports = function(e) { e.registerDependency("sources/device", i(181)), e.registerVisitorProfileProvider(i(182)), e.registerAudienceMatcher("device", i(183)) } } ), (function(e, t, i) { var n = i(166); t.getDevice = function() { var e = n.get().device; return "unknown" !== e.model ? e.model : "tablet" === e.type ? "tablet" : e.isMobile ? "mobile" : "desktop" } } ), (function(e, t) { e.exports = { provides: "device", shouldTrack: !0, isSticky: !0, getter: ["sources/device", function(e) { return e.getDevice() } ] } } ), (function(e, t) { e.exports = { fieldsNeeded: ["device"], match: function(e, t) { return e.device === t.value } } } ), (function(e, t, i) { e.exports = function(e) { e.registerVisitorProfileProvider(i(185)), e.registerAudienceMatcher("device_type", i(186)) } } ), (function(e, t, i) { var n = i(166); e.exports = { provides: "device_type", shouldTrack: !0, isSticky: !0, getter: [function() { var e = n.get().device; switch (e.type) { case "mobile": return "phone"; case "tablet": case "desktop_laptop": return e.type; default: return "other" } } ] } } ), (function(e, t) { e.exports = { fieldsNeeded: ["device_type"], match: function(e, t) { return e.device_type === t.value } } } ), (function(e, t, i) { e.exports = function(e) { e.registerVisitorProfileProvider(i(188)), e.registerAudienceMatcher("referrer", i(189)) } } ), (function(e, t, i) { var n = i(80) , r = i(99); e.exports = { provides: "referrer", shouldTrack: !0, isSticky: !0, getter: [function() { var e = r.getReferrer() || n.getReferrer(); return "" === e && (e = null), e } ] } } ), (function(e, t, i) { var n = i(190); t.fieldsNeeded = ["referrer"], t.match = function(e, t) { return null !== e.referrer && n(e.referrer, t) } } ), (function(e, t, i) { function n(e) { var t = e.indexOf("?"); return t !== -1 && (e = e.substring(0, t)), t = e.indexOf("#"), t !== -1 && (e = e.substring(0, t)), e } function r(e) { return a(n(e)) } function a(e, t) { e = e.replace("/?", "?"), e = e.toLowerCase().replace(/[\/&?]+$/, ""); var i = l.slice(0); t || (i = i.concat(u)); for (var n = i.length, r = 0; r < n; r++) { var a = i[r] , o = new RegExp("^" + a); e = e.replace(o, "") } return e } function o(e) { var t = e.split("?"); if (t[1]) { var i = t[1].split("#") , n = i[0] , r = i[1] , a = n.split("&") , o = []; return s.each(a, (function(e) { 0 !== e.indexOf(c) && o.push(e) } )), t[1] = "", o.length > 0 && (t[1] = "?" + o.join("&")), r && (t[1] += "#" + r), t.join("") } return e } var s = i(2); e.exports = function(e, t) { e = o(e); var i = t.value; switch (t.match) { case "exact": return e = a(e), e === a(i); case "regex": try { return Boolean(e.match(i)) } catch (e) {} return !1; case "simple": return e = r(e), i = r(i), e === i; case "substring": return e = a(e, !0), i = a(i, !0), e.indexOf(i) !== -1; default: return !1 } } ; var u = ["www."] , c = "optimizely_" , l = ["https?://.*?.?optimizelyedit.(com|test)/", "https?://.*.?optimizelypreview.(com|test)/", "https?://(edit|preview)(-hrd|-devel)?.optimizely.(com|test)/", "https?://.*?.?optimizelyedit(-hrd)?.appspot.com/", "https?://"]; } ), (function(e, t, i) { e.exports = function(e) { e.registerVisitorProfileProvider(i(192)), e.registerAudienceMatcher("source_type", i(194)) } } ), (function(e, t, i) { var n = i(119) , r = i(80) , a = i(99) , o = i(193) , s = ["google\\.\\w{2,3}(\\.\\w{2,3})?/(search|url)", "bing\\.\\w{2,3}(\\.\\w{2,3})?/(search|url)", "yahoo\\.\\w{2,3}(\\.\\w{2,3})?/search", "baidu\\.\\w{2,3}(\\.\\w{2,3})?/", "https://(www)?\\.google\\..*?/?$", "https://search\\.yahoo\\..*?/?$", "https://(www)?\\.bing\\..*?/?$"]; e.exports = { provides: "source_type", shouldTrack: !0, isSticky: !1, getter: [function() { return function(e, t) { var i = function() { if (n.getQueryParamValue("utm_source") || n.getQueryParamValue("gclid") || n.getQueryParamValue("otm_source")) return "campaign"; for (var e = a.getReferrer() || r.getReferrer(), t = 0; t < s.length; t++) { var i = s[t] , u = e.match(i); if (u) return "search" } return e && o.guessDomain(e) !== o.guessDomain(n.getUrl()) ? "referral" : "direct" } , u = function(e, t) { return !e || "direct" !== t } , c = e() , l = i(); u(c, l) && t(l) } } ] } } ), (function(e, t) { t.guessDomain = function(e, t) { if (!e) return ""; try { return t ? e.match(/:\/\/(.[^\/]+)/)[1] : e.match(/:\/\/(?:www[0-9]?\.)?(.[^\/:]+)/)[1] } catch (e) { return "" } } } ), (function(e, t, i) { var n = i(20); t.fieldsNeeded = ["source_type"], t.match = function(e, t) { return n.hasMatch(t.value, t.match, e.source_type) } } ), (function(e, t, i) { e.exports = function(e) { e.registerVisitorProfileProvider(i(196)), e.registerVisitorProfileProvider(i(197)), e.registerAudienceMatcher("time_and_day", i(198)) } } ), (function(e, t, i) { var n = i(24); e.exports = { provides: "currentTimestamp", shouldTrack: !0, isLazy: !0, getter: [function() { return n.now() } ] } } ), (function(e, t) { e.exports = { provides: "offset", shouldTrack: !0, isLazy: !0, getter: [function() { return (new Date).getTimezoneOffset() } ] } } ), (function(e, t, i) { var n = i(199); t.fieldsNeeded = ["currentTimestamp"], t.match = function(e, t) { return n.test(t.value, new Date(e.currentTimestamp)) } } ), (function(e, t, i) { function n(e) { var t = e.split(o); if (3 !== t.length) throw new Error("Invalid time and day string " + e); var i = t[2].split(s); return { start_time: t[0], end_time: t[1], days: i } } function r(e) { var t = e.split(u); if (2 !== t.length) throw new Error("optly.timeAndDayInterval.timeStringToMinutes: Invalid time string " + e); return 60 * parseInt(t[0], 10) + parseInt(t[1], 10) } var a = i(2) , o = "_" , s = "," , u = ":"; t.test = function(e, t) { var i = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"] , o = n(e) , s = r(o.start_time) , u = r(o.end_time) , c = 60 * t.getHours() + t.getMinutes() , l = i[t.getDay()]; return c >= s && c <= u && a.includes(o.days, l) } } ), (function(e, t, i) { function n(e) { var t = e.getGlobal(l); return t ? e.getGlobal(t) : null } var r = i(26) , a = i(23) , o = i(88) , s = i(99) , u = i(115) , c = i(40) , l = "GoogleAnalyticsObject" , d = 150 , f = "google_universal_analytics" , g = i(95) , p = function(e) { var t = e.integrationSettings; if (t && t[f] && e.experimentId && e.variationId) { var i = { id: e.layerId, name: e.layerName, policy: e.layerPolicy, integrationStringVersion: e.integrationStringVersion } , n = { id: e.experimentId, name: e.experimentName } , r = { id: e.variationId, name: e.variationName } , o = e.isLayerHoldback , s = g.generateAnalyticsString(i, n, r, o, d, !0); if (s) return h(s, t[f])["catch"]((function(e) { a.warn("Tracker for", f, "failed:", e) } )) } } , h = function(e, t) { var i = 50 , r = 200; return o.pollFor((function() { return n(c) } ), r, i).then((function(i) { var n = t.universal_analytics_tracker , r = n ? n + "." : "" , a = t.universal_analytics_slot , o = s.getReferrer(); o && i(r + "set", "referrer", o); var u = { nonInteraction: !0 }; u["dimension" + a] = e, i(r + "send", "event", "Optimizely", "Assigned To Campaign", u) } )) } , _ = { preRedirectPolicy: u.PreRedirectPolicies.PERSIST_BEFORE_REDIRECT, postRedirectPolicy: u.PostRedirectPolicies.TRACK_IMMEDIATELY, nonRedirectPolicy: u.NonRedirectPolicies.TRACK_IMMEDIATELY, trackLayerDecision: p, serializeSettings: r.stringify, deserializeSettings: r.parse }; e.exports = function(e) { e.registerAnalyticsTracker("google_universal_analytics", _) } } ), (function(e, t, i) { function n(e) { function t(e, t, i) { try { u(t), e[i] = t } catch (e) { C.emitError(new X("Bad value for eventTags[" + i + "]: " + e.message)) } return e } var i = N.keys(ie) , n = N.omit(e, i) , r = N.pick(e, i) , a = N.reduce(n, t, {}) , o = N.reduce(r, (function(e, i, n) { var r = ie[n]; r.excludeFeature || t(a, i, n); try { r.validate(i), e[n] = r.sanitize(i), a[n] = e[n] } catch (e) { C.emitError(new X("Bad value for eventMetrics[" + n + "]: " + e.message)) } return e } ), {}); return o.tags = a, o } function r(e) { var t = N.extend({ entity_id: e.pageId, key: e.pageApiName, timestamp: e.timestamp, uuid: e.eventId, type: J }, n(e.eventTags)); return t } function a(e) { return N.extend({ entity_id: e.eventEntityId, key: e.eventApiName, timestamp: e.timestamp, uuid: e.eventId, type: e.eventCategory }, n(e.eventTags)) } function o(e) { return N.extend({ entity_id: e.eventEntityId, key: e.eventApiName, timestamp: e.timestamp, uuid: e.eventId, type: e.eventCategory }, n(e.eventTags)) } function s(e) { return { entity_id: null, type: Q, uuid: e.eventId, timestamp: e.timestamp } } function u(e) { if (null == e) throw new Error("Feature value is null"); if ("object" == typeof e) { var t; try { t = F.stringify(e) } catch (e) {} throw new Error('Feature value is complex: "' + t || '[object]"') } } function c(e) { if (null == e) throw new Error("Metric value is null"); if (!N.isNumber(e)) throw new Error("Metric value is not numeric") } function l(e) { return N.reduce(e, (function(e, t) { try { u(t.value), e.push({ entity_id: t.id || null, key: t.name, type: t.type, value: t.value }) } catch (e) { x.warn("Error evaluating user feature", t, e) } return e } ), []) } function d(e, t, i) { Y.dispatch(V.REGISTER_TRACKER_EVENT, { event: e, decisions: i }), f(t), D() } function f(e) { var t = l(e); Y.dispatch(V.UPDATE_TRACKER_VISITOR_ATTRIBUTES, { attributes: t }) } function g(e) { var t = l(e.userFeatures) , i = { account_id: e.accountId, anonymize_ip: e.anonymizeIP, client_name: e.clientName, client_version: e.clientVersion, project_id: e.projectId, visitors: [{ session_id: h(e.sessionId), visitor_id: e.visitorId, attributes: t, snapshots: [{ decisions: [{ campaign_id: e.layerId, experiment_id: e.experimentId, variation_id: e.variationId, is_campaign_holdback: e.isLayerHoldback }], events: [{ uuid: e.decisionId, entity_id: e.layerId, timestamp: e.timestamp, type: $ }] }] }] }; Y.dispatch(V.REGISTER_PREVIOUS_BATCH, i), D() } function p(e) { var t = N.isNull(q.getAnonymizeIP()) ? void 0 : q.getAnonymizeIP() , i = { account_id: e.accountId, anonymize_ip: t, client_name: e.clientName, client_version: e.clientVersion, project_id: e.projectId, visitors: [] }; i.revision = e.revision, Z && (i.enrich_decisions = !0); var n = { session_id: h(e.sessionId), visitor_id: e.visitorId, attributes: [], snapshots: [] } , r = b(e.layerStates); Y.dispatch(V.REGISTER_TRACKER_VISITOR, { data: i, visitor: n, decisions: r }), D() } function h(e) { return oe ? ae : e } function _(e) { var t = { entity_id: e.layerId, type: $, uuid: e.decisionId, timestamp: e.timestamp }; Y.dispatch(V.REGISTER_TRACKER_DECISION, { decisionEvent: t, decisions: b(e.layerStates) }), f(e.userFeatures), D() } function v() { if (!W.canSend()) return void x.debug("Not sending events (holding)"); var e = W.hasEventsToSend() , t = W.hasPreviousBatchesToSend(); return e || t ? (t && (N.each(W.getPreviousBatches(), m), Y.dispatch(V.RESET_TRACKER_PREVIOUS_BATCHES)), void (e && (Y.dispatch(V.FINALIZE_BATCH_SNAPSHOT), m(W.getEventBatch()), Y.dispatch(V.RESET_TRACKER_EVENTS)))) : void x.debug("Not sending events because there are no events to send") } function m(e) { x.debug("Sending ticket:", e); var t = L.generate(); B.retryableRequest({ url: P, method: "POST", data: E(e) }, t) } function E(e) { var t = N.extend({}, N.pick(e, ["account_id", "anonymize_ip", "client_name", "client_version", "enrich_decisions", "project_id", "revision"]), { visitors: N.map(e.visitors, I) }); return t } function I(e) { return { visitor_id: e.visitor_id, session_id: ae, attributes: N.map(e.attributes, y), snapshots: N.map(e.snapshots, S) } } function y(e) { return w(e, { entity_id: "e", key: "k", type: "t", value: "v" }) } function S(e) { var t = e.events; return t = A(t), { activationTimestamp: q.getActivationTimestamp(), decisions: N.map(e.decisions, T), events: N.map(t, R) } } function A(e) { var t = N.reduce(e, (function(e, t) { var i, n = t.type === J && N.isEmpty(t.tags) && N.isEmpty(N.pick(t, N.keys(ie))); if (i = n ? t.type : t.uuid, e[i]) { var r = e[i].timestamp; t.timestamp > r && (r = t.timestamp), e[i] = N.extend({}, e[i], { key: e[i].key + "-" + (t.key || ""), entity_id: e[i].entity_id + "-" + t.entity_id, timestamp: r }) } else e[i] = t; return e } ), {}); return N.values(t) } function T(e) { return w(e, { campaign_id: "c", experiment_id: "x", is_campaign_holdback: "h", variation_id: "v" }) } function R(e) { return e.key === $ && (e.type = $, delete e.key), w(e, { entity_id: "e", key: "k", quantity: "q", revenue: "$", tags: "a", timestamp: "t", uuid: "u", value: "v", type: "y" }) } function w(e, t) { return N.reduce(e, (function(e, i, n) { return n in t && (e[t[n] || n] = i), e } ), {}) } function D() { function e() { var t = !ne || j.isLoaded(); t && v(), W.isPolling() && G.setTimeout(e, te) } return W.shouldBatch() ? void (W.isPolling() || (G.setTimeout(e, te), Y.dispatch(V.SET_TRACKER_POLLING, !0), G.setTimeout((function() { Y.dispatch(V.SET_TRACKER_BATCHING, !1), Y.dispatch(V.SET_TRACKER_POLLING, !1) } ), ee))) : void v() } function b(e) { return N.map(e, (function(e) { return { campaign_id: e.layerId, experiment_id: e.decision.experimentId, variation_id: e.decision.variationId, is_campaign_holdback: e.decision.isLayerHoldback } } )) } function O() { var e = W.getPersistableState(); if (e) try { x.debug("Persisting pending batch:", e), U.persistTrackerOptimizelyData(e), Y.dispatch(V.SET_TRACKER_DIRTY, !1) } catch (e) { x.debug("Failed to persist pending batch:", e) } } var N = i(2) , C = i(86) , L = i(5) , P = "https://logx.optimizely.com/v1/events" , V = i(7) , k = i(76).create , F = i(26) , x = i(23) , M = i(115) , U = i(74) , G = i(40) , B = i(91) , z = i(16) , j = i(80) , H = i(87) , K = i(111) , Y = i(9) , q = z.get("stores/global") , W = z.get("stores/tracker_optimizely") , X = t.Error = k("OptimizelyTrackerError") , Q = "client_activation" , $ = "campaign_activated" , J = "view_activated" , Z = !0 , ee = 1e4 , te = 1e3 , ie = { revenue: { validate: c, sanitize: Math.floor, excludeFeature: !0 }, quantity: { validate: c, sanitize: Math.floor, excludeFeature: !0 }, value: { validate: c, sanitize: N.identity } } , ne = !1 , re = !1 , ae = "AUTO" , oe = !0 , se = function(e) { e.timing === M.TrackLayerDecisionTimingFlags.postRedirectPolicy ? g(e) : _(e) } , ue = [function() { return function(e) { d(r(e), e.userFeatures, b(e.layerStates)) } } ] , ce = [function() { return function(e) { p(e), d(s(e), e.userFeatures, b(e.layerStates)) } } ] , le = [function() { return function(e) { d(o(e), e.userFeatures, b(e.layerStates)) } } ] , de = [function() { return function(e) { d(a(e), e.userFeatures, b(e.layerStates)) } } ] , fe = { trackLayerDecision: se, postRedirectPolicy: M.PostRedirectPolicies.TRACK_AFTER_SYNC, nonRedirectPolicy: M.NonRedirectPolicies.TRACK_IMMEDIATELY, onPageActivated: ue, onClientActivation: ce, onClickEvent: de, onCustomEvent: le }; e.exports = function(e) { e.registerAnalyticsTracker("optimizely", fe), H.on({ filter: { type: K.TYPES.ANALYTICS, name: "sendEvents" }, handler: function() { Y.dispatch(V.SET_TRACKER_SEND_EVENTS, !0), W.isPolling() || v() } }), H.on({ filter: { type: K.TYPES.ANALYTICS, name: "holdEvents" }, handler: function() { Y.dispatch(V.SET_TRACKER_SEND_EVENTS, !1) } }), Y.dispatch(V.SET_TRACKER_SEND_EVENTS, !re); var t = H.on({ filter: { type: "lifecycle", name: "activated" }, handler: function() { W.observe(O), H.off(t) } }) } } ), (function(e, t, i) { e.exports = function(e) { e.registerApiModule("recommender", i(203)) } } ), (function(e, t, i) { function n(e) { return e === T.SELF_CONTAINED_MULTI_COL } function r(e) { return e === T.SEPARATE_CATALOG_SINGLE_COL } function a(e, t) { if (!n(t)) return w in e ? I.parse(e[w]) : (y.warn('recommender / Expected key "' + w + '" not found'), []); var i = new RegExp("^" + D + "(\\d+)$") , r = E.reduce(e, (function(t, n, r) { var a = r.match(i); if (a) { var o = I.parse(e[r]); o && E.isObject(o) && (t[a[1]] = o) } return t } ), []); return E.filter(r, (function(e) { return !E.isUndefined(e) } )) } function o(e, t) { return [e, encodeURIComponent(t)].join("/") } function s(e, t) { var i = function(e, t, i) { if (!E.isArray(e) || E.isEmpty(e)) throw new Error("No " + i + "s available"); var n; if (t) { if (n = E.find(e, { id: t }), !n) throw new Error("No " + i + " found with specified id " + t) } else { if (e.length > 1) throw new Error("No " + i + " id specified when there are more than one available."); n = e[0] } return n } , n = e.getRecommenderServices() , r = i(n, t && t.recommenderServiceId, "recommender service"); r.idTagName || (r.idTagName = "id"); var a = i(r.recommenders, t && t.recommenderId, "recommender"); return { recommenderService: r, recommender: a } } function u(e) { var t = I.parse(e); return t.data } function c(e, t) { return A.request({ url: o(e, t) }).then((function(e) { var t = u(e.response) , i = {}; return R in t && (i = I.parse(t[R])), i } )) } function l(e, t, i, n) { var s = !(!n || !n.fetchWithMetadata) , c = n && n.overrideServingUrl || t.servingUrl; return A.request({ url: o(c, i) }).then((function(t) { var i = [] , o = u(t.response); return i = a(o, e.serviceVersion), s && r(e.serviceVersion) ? d(e, E.map(i, e.idTagName), n).then((function(e) { return e = E.map(e, (function(e) { return e instanceof Error && (e = {}), delete e["__proto__"], e } )), E.merge(i, e) } )) : i } )) } function d(e, t, i) { var n = i && i.overrideCatalogUrl || e.catalogUrl; return E.isString(t) ? c(n, t) : S.all(E.map(t, (function(e) { return c(n, e)["catch"]((function(t) { return y.warn("recommender / Failed to get recommendations for item:", e, t), t } )) } ))) } function f(e, t, i) { var n = s(e, i) , r = n.recommenderService , a = n.recommender; return l(r, a, t, { overrideServingUrl: i && i.overrideServingUrl, overrideCatalogUrl: i && i.overrideCatalogUrl, fetchWithMetadata: !0 }) } function g(e, t, i) { var n = s(e, i) , a = n.recommenderService , o = n.recommender; if (!r(a.serviceVersion)) throw new Error("Recommender service " + a.id + " serves self-contained recos. Use `fetchRecommendations` API call"); return l(a, o, t, { overrideServingUrl: i && i.overrideServingUrl, fetchWithMetadata: !1 }) } function p(e, t, i) { var n = s(e, i) , a = n.recommenderService; if (!r(a.serviceVersion)) throw new Error("Recommender service " + a.id + " serves self-contained recos. Use `fetchRecommendations` API call"); return E.isArray(t) && t.length > b ? S.reject("Cannot fetch more than " + b + " items") : d(a, t, i) } function h(e, t, i, n) { return new _(e,t,i,n) } function _(e, t, i, n) { this.recommenderSettings = t; var r = s(e, t); this.recommenderService = r.recommenderService, this.recommender = r.recommender, this.targetId = i, n && (this.preFilter = n.preFilter, this.canonicalize = n.canonicalize, this.postFilter = n.postFilter), this._globalStore = e, this.reset() } function v() { var e = { recosNoMeta: [], recosNoMetaOffset: 0, recos: [], recosOffset: 0 }; return y.debug("recommender / fetching recommended items for", this.targetId, "from recommender", this.recommender.id), r(this.recommenderService.serviceVersion) ? g(this._globalStore, this.targetId, this.recommenderSettings).then(E.bind((function(t) { return e.recosNoMeta = E.filter(t, this.preFilter), e } ), this)) : f(this._globalStore, this.targetId, this.recommenderSettings).then(E.bind((function(t) { return e.recos = E(t).filter(this.preFilter).map(this.canonicalize).filter(this.postFilter).value(), e } ), this)) } function m(e) { var t = e.numNeeded , i = e.buffer , n = i.recosNoMeta.length - i.recosNoMetaOffset; if (t <= 0 || n <= 0) return S.resolve(e); var r = 5 , a = Math.max(t, r) , o = E.slice(i.recosNoMeta, i.recosNoMetaOffset, i.recosNoMetaOffset + a) , s = E.map(o, this.recommenderService.idTagName); i.recosNoMetaOffset += s.length; var u = e.recosSoFar; return y.debug("recommender / fetching metadata for", s, "from recommender", this.recommender.id), p(this._globalStore, s, this.recommenderSettings).then(E.bind((function(n) { n = E.map(n, (function(e) { return e instanceof Error ? {} : e } )), i.recos = E(o).merge(n).map(this.canonicalize).filter(this.postFilter).value(); var r = E.slice(i.recos, 0, t); return i.recosOffset = r.length, e.recosSoFar = u.concat(r), e.numNeeded -= r.length, e.numNeeded > 0 ? m.call(this, e) : e } ), this)) } var E = i(2) , I = i(26) , y = i(23) , S = i(12).Promise , A = i(91) , T = { SELF_CONTAINED_MULTI_COL: 1, SEPARATE_CATALOG_SINGLE_COL: 2 } , R = "itemMetadata" , w = "recos" , D = "reco" , b = 20; _.prototype.reset = function() { this._bufferPromise = null } , _.prototype.next = function(e) { var t = Math.floor(E.isNumber(e) ? e : 1); if (t <= 0) throw new Error("Invalid argument " + e + ". Must be positive integer"); this._bufferPromise || (this._bufferPromise = v.call(this)); var i = this._bufferPromise.then(E.bind((function(e) { var i = [] , n = e.recos.length - e.recosOffset; return n > 0 && (i = e.recos.slice(e.recosOffset, e.recosOffset + t), e.recosOffset += i.length, t -= i.length), t <= 0 ? { result: i, buffer: e } : m.call(this, { buffer: e, recosSoFar: i, numNeeded: t }).then((function(e) { return { result: e.recosSoFar, buffer: e.buffer } } )) } ), this)); return this._bufferPromise = i.then((function(e) { return e.buffer } )), i.then((function(e) { return e.result } )) } , e.exports = ["stores/global", function(e) { return { fetchRecommendations: E.partial(f, e), fetchRecommendedItems: E.partial(g, e), fetchItemMetadata: E.partial(p, e), getRecommendationsFetcher: E.partial(h, e) } } ] } )]);